有没有办法同步等待或检查web-worker中的新消息?
我有一大堆复杂的代码(从emscripten编译的LLVM ),我不能围绕回调进行重构。
我需要确保在接收并处理来自UI-thread的消息之前,不会执行某一行之后的代码。如果我使用while循环阻塞,事件循环永远不会运行,所以我不能接收消息。
发布于 2021-08-28 06:31:09
这也是我在使用Pyodide时遇到的一个问题。我想从主线程‘同步’调用一个函数。
一种解决方案涉及Atomic和SharedArrayBuffer API。从web worker的角度来看,这看起来如下所示
用Atomics.wait
postMessage,,
SharedArrayBuffer中读取结果。我们不能以postMessage的形式接收结果,因为没有一种同步的方式来询问“我收到消息了吗”。当然,这需要相当多的额外代码来处理所有的序列化、数据传递等等。
这样做的一个限制是它不能在Safari中工作,因为Safari没有实现Atomic的API。另一个限制是,要使用这些API,需要有COOP/COEP headers set。
还有一种使用synchronous XHR and a service worker的替代解决方案,但我还没有研究过该选项。
发布于 2013-05-16 01:41:43
不,不幸的是。有一些关于添加阻止来自父页面的消息的方法的讨论,但没有取得任何进展。我看看能不能找到相关的邮件列表线程。
发布于 2015-02-07 23:31:15
你可以在不重构的情况下打破下面的序列吗?
wrk.onmessage = function(e) {
if (e.data.step === 'initial input') {
doInitialWork(e.data.inputs)
} else if (e.data.step === 'ui input') {
doTheRest(e.data.uiData)
}
}onmessage事件将被阻塞,直到初始步骤执行堆栈完成,关键ui位才会在信息可用时启动。
https://stackoverflow.com/questions/10590213
复制相似问题