WebAssembly также блокирует веб-рабочий поток - PullRequest
0 голосов
/ 18 ноября 2018

Это связано с предыдущим вопросом WebAssembly в асинхронном коде

По сути, этот вопрос касается проблемы блокирования основного потока WebAssembly, и ответ на этот вопрос заключается впереместить код WebAssembly веб-работнику.Это работает.

Проблема теперь в том, что WebAssembly блокирует onmessage () на рабочем.

Мой долго работающий код WebAssembly имеет функции, такие как play (), pause (), stop ()и т. д. play () периодически проверяет флаг паузы и флаг остановки, чтобы определить, должен ли play () вернуться.Pause () и stop () используются для установки этих флагов.

Основной поток JavaScript вызывает postMessage () для отправки сообщения работнику, который затем вызывает play ().

Так как onmessage () заблокирован, работник не будет иметь возможности получать дальнейшие сообщения для выполнения pause () или stop () до завершения play ().Это победит сами цели паузы / остановки.

Кажется, простой вариант использования play / pause / stop не может быть поддержан WebAssembly.

Любые комментарии или предложения?

Кстати, этот вариант использования хорошо поддерживается несуществующим Google PNaCl.

Спасибо.

1 Ответ

0 голосов
/ 25 ноября 2018

Вкратце: веб-рабочие серверы не игнорируют сообщения, даже если веб-рабочий поток заблокирован.

Все события браузера, включая события веб-рабочего postMessage() / onmessage(), помещаются в очередь.Это фундаментальная философия JavaScript (а также ваш случай, потому что onmessage() выполняется на стороне JS, даже если вы используете WebAssembly).Посмотрите на «Модель параллелизма и цикл обработки событий» из MDN для получения дополнительной информации.

Итак, что произойдет в вашем случае, пока onmessage() заблокирован, события из основного потока postMessage() ставятся в очередь автоматически.Когда одиночное задание onmessage() завершается в рабочем потоке, из очереди рабочих событий проверяет, вызван ли postMessage() до его завершения, и перехватывает сообщение, если оно есть.Так что вам не нужно беспокоиться об этом случае, если задание onmessage() занимает около 10 секунд и вы получаете сотни событий в очереди.

Именно так асинхронное выполнение выполняется везде вбраузер.

...