8

请考虑以下代码和本 Mozilla 教程“使用网络工作者”中的解释:

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

此示例中的第 1 行创建并开始运行工作线程。 第 2 行将 worker 的 onmessage 处理程序设置为一个函数,该函数在 worker 调用自己的 postMessage() 函数时调用。

线程在调用Worker构造函数的那一刻启动。我想知道设置onmessage处理程序是否可能存在竞争条件。例如,如果网络工作者在设置onmessage之前发布了一条消息。

有人知道更多吗?

更新:

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

例如:

主脚本:

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

网络工作者脚本('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 中设置超时来尝试它!目前我看不到,如何在不遇到竞争条件的情况下使用网络工作者?!

4

1 回答 1

5

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

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

于 2010-08-05T15:34:52.523 回答