WebAssembly也会阻塞Web Worker线程

时间:2018-11-17 23:12:16

标签: asynchronous emscripten webassembly

这与上一个问题WebAssembly in async code

有关

基本上,该问题与WebAssembly阻塞主线程的问题有关,该问题的答案是将WebAssembly代码移至Web Worker。可行。

现在的问题是WebAssembly阻止了工作程序上的onmessage()。

我运行时间较长的WebAssembly代码具有play(),pause(),stop()等功能。play()定期检查暂停标志和停止标志,以确定play()是否应返回。 pause()和stop()用于设置这些标志。

JavaScript主线程调用postMessage()将消息发送给工作程序,然后进一步调用play()。

由于onmessage()被阻止,因此在play()完成之前,工作人员将没有机会接收进一步的消息来做pause()或stop()。那会破坏暂停/停止的目的。

似乎WebAssembly不支持简单的播放/暂停/停止用例。

有任何意见或建议吗?

顺便说一句,已失效的Google PNaCl很好地支持了该用例。

谢谢。

1 个答案:

答案 0 :(得分:1)

简而言之:即使Web工作线程被阻止,Web工作人员也不会忽略消息。

所有浏览器事件,包括Web worker postMessage() / onmessage()事件都已排队。这是JavaScript的基本原理(也是您的情况,因为onmessage()是在JS端完成的,即使您使用WebAssembly也是如此)。请查看"Concurrency model and Event Loop" from MDN了解更多详情。

因此,在您遇到的情况下,onmessage()被阻止时,来自主线程postMessage()的事件将自动排队。当单个onmessage()作业在工作线程中完成时,将从工作程序事件队列中检查postMessage()是否在完成之前被调用,并捕获是否存在消息。因此,只要onmessage()作业耗时约10秒,并且队列中有数百个事件,您就不必担心这种情况。

这是在浏览器中各处执行异步执行的方式。