Asynchronous WebAssembly也会阻止web工作线程

Asynchronous WebAssembly也会阻止web工作线程,asynchronous,emscripten,webassembly,Asynchronous,Emscripten,Webassembly,这与前面的问题有关 基本上,这个问题是关于WebAssembly阻塞主线程的问题,而这个问题的答案是将WebAssembly代码移动到web工作者。这很有效 现在的问题是WebAssembly会阻止worker上的onmessage() 我的长时间运行的WebAssembly代码具有play()、pause()、stop()等函数。play()定期检查暂停标志和停止标志,以确定play()是否应返回。pause()和stop()用于设置这些标志 JavaScript主线程调用postMessag

这与前面的问题有关

基本上,这个问题是关于WebAssembly阻塞主线程的问题,而这个问题的答案是将WebAssembly代码移动到web工作者。这很有效

现在的问题是WebAssembly会阻止worker上的onmessage()

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

JavaScript主线程调用postMessage()向worker发送消息,worker进一步调用play()

由于onmessage()已被阻止,因此在播放()完成之前,工作者将没有机会接收更多要执行暂停()或停止()的消息。这将破坏暂停/停止的目的

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

有什么意见或建议吗

顺便说一句,这个用例得到了已经不存在的GooglePNACL的良好支持


谢谢。

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

所有浏览器事件,包括web worker
postMessage()
/
onmessage()
事件都已排队。这是JavaScript的基本原理(
onmessage()
在JS中完成,即使您使用WebAssembly)。请查看以了解更多详细信息

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

这就是异步执行在浏览器中随处可见的方式