Asynchronous WebAssembly也会阻止web工作线程
这与前面的问题有关 基本上,这个问题是关于WebAssembly阻塞主线程的问题,而这个问题的答案是将WebAssembly代码移动到web工作者。这很有效 现在的问题是WebAssembly会阻止worker上的onmessage() 我的长时间运行的WebAssembly代码具有play()、pause()、stop()等函数。play()定期检查暂停标志和停止标志,以确定play()是否应返回。pause()和stop()用于设置这些标志 JavaScript主线程调用postMessage()向worker发送消息,worker进一步调用play() 由于onmessage()已被阻止,因此在播放()完成之前,工作者将没有机会接收更多要执行暂停()或停止()的消息。这将破坏暂停/停止的目的 似乎WebAssembly不支持播放/暂停/停止的简单用例 有什么意见或建议吗 顺便说一句,这个用例得到了已经不存在的GooglePNACL的良好支持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
谢谢。简而言之:即使Web工作线程被阻止,Web工作人员也不会忽略消息 所有浏览器事件,包括web worker
postMessage()
/onmessage()
事件都已排队。这是JavaScript的基本原理(onmessage()
在JS中完成,即使您使用WebAssembly)。请查看以了解更多详细信息
因此,在您的情况下,当阻止onmessage()
时,来自主线程postMessage()
的事件将自动排队。当工作线程中的单个onmessage()
作业完成时,从工作线程事件队列中,将检查是否在其完成之前调用了postMessage()
,并捕获消息(如果有)。因此,只要onmessage()
作业需要大约10秒钟,并且队列中有数百个事件,您就不必担心这种情况
这就是异步执行在浏览器中随处可见的方式