这与上一个问题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很好地支持了该用例。
谢谢。
答案 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秒,并且队列中有数百个事件,您就不必担心这种情况。
这是在浏览器中各处执行异步执行的方式。