WebAssembly也会阻止Web工作线程

问题描述 投票:1回答:1

这与前一个问题WebAssembly in async code有关

基本上,这个问题是关于WebAssembly阻塞主线程的问题,问题的答案是将WebAssembly代码移动到Web worker。这样可行。

现在的问题是WebAssembly阻塞了worker上的onmessage()。

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

JavaScript主线程调用postMessage()向工作者发送消息,进一步调用play()。

由于onmessage()被阻止,因此在play()完成之前,worker将没有机会接收进一步的消息来执行pause()或stop()。这将打败暂停/停止的目的。

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

有什么意见或建议吗?

顺便说一句,该用例得到了已停止运行的Google PNaCl的良好支持。

谢谢。

asynchronous emscripten webassembly
1个回答
1
投票

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

所有浏览器事件(包括Web worker postMessage() / onmessage()事件)都排队等候。这是JavaScript的基本原理(也是你的情况,因为即使你使用WebAssembly,onmessage()也是在JS方面完成的)。请查看"Concurrency model and Event Loop" from MDN以获取更多详细信息。

那么在你的情况下会发生什么,当onmessage()被阻止时,来自主线程postMessage()的事件会自动排队。当单个onmessage()作业在工作线程中完成时,将从工作事件队列中检查postMessage()在完成之前是否被调用,如果存在则捕获该消息。因此,只要onmessage()作业需要10秒钟,并且队列中有数百个事件,您就不必担心这种情况。

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

© www.soinside.com 2019 - 2024. All rights reserved.