html - 设置 onmessage 处理程序时与网络 worker 的竞争条件?

标签 html race-condition web-worker

请考虑以下代码和本 Mozilla 教程中的解释 "Using web workers" :

var myWorker = new Worker('my_worker.js');
myWorker.onmessage = function(event) {
  print("Called back by the worker!\n");
};

Line 1 in this example creates and starts running the worker thread. Line 2 sets the onmessage handler for the worker to a function that is called when the worker calls its own postMessage() function.

线程在 Worker 构造函数被调用时启动。我想知道在设置 onmessage 处理程序时是否存在竞争条件。例如,如果网络 worker 在 onmessage 设置之前发布消息。

有人知道更多吗?

更新:

Andrey 指出网络 worker 应该在收到消息时开始工作,就像 Mozilla 教程中的 Fibonacci 示例一样。但这不会在网络 worker 中设置 onmessage 处理程序时创建新的竞争条件吗?

例如:

主要脚本:

var myWorker = new Worker('worker.js');
myWorker.onmessage = function(evt) {..};
myWorker.postMessage('start');

网络 worker 脚本('worker.js')

var result = [];
onmessage = function(evt) {..};

然后考虑下面的执行路径:

main thread                                  web worker
var worker = new Worker("worker.js");
                                             var result = [];
myWorker.onmessage = ..
myWorker.postMessage('start');
                                             onmessage = ..

var result = []”这一行可以省略,仍然是一样的效果。

这是一个有效的执行路径,我通过在 web worker 中设置超时来尝试它!目前我看不出如何在不遇到竞争条件的情况下使用网络 worker ?!

最佳答案

答案是主脚本和网络 worker 都有一个MessagePort队列,它在初始 worker 脚本返回之前收集消息。

有关详细信息,请参阅 WHATWG 帮助邮件列表中的此线程: http://lists.whatwg.org/pipermail/help-whatwg.org/2010-August/000606.html

关于html - 设置 onmessage 处理程序时与网络 worker 的竞争条件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3213433/

相关文章:

html - 如何防止一个div元素被另一个div元素的box-shadow影响?

javascript - 单击更改类别

iOS:有选择地禁用 captureOutput 的处理:didOutputSampleBuffer:fromConnection:来自 AVFoundation 中的主线程

ios - 来自 App Delegate 的启动任务并避免竞争条件的策略

javascript - Web Workers 可以访问 Vue 应用程序中定义的类吗?

javascript - 我可以在 webworker 中加载 AMD 模块吗?

html - css 3 框阴影左上底部

html - CSS 文本为 1 个订单项模仿两行

python - 单线程中的 os.mkdir 竞争条件?如何确保在继续之前创建目录

javascript - 如何在数组中向网络工作人员创建/发布消息