【问题标题】:Race-condition with web workers when setting onmessage handler?设置 onmessage 处理程序时与网络工作者的竞争条件?
【发布时间】:2011-03-13 21:48:36
【问题描述】:

请考虑下面的代码和这个Mozilla教程"Using web workers"的解释:

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

本例中的第 1 行 创建并 开始运行工作线程。 第 2 行设置 onmessage 处理程序 工人的功能是 当工人调用自己的时调用 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 中设置超时来进行尝试!目前我看不到,如何在不遇到竞争条件的情况下使用网络工作者?!

【问题讨论】:

标签: html race-condition web-worker


【解决方案1】:

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

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

【讨论】:

  • 邮件列表的链接现已断开。知道在哪里阅读该线程,或者是否有任何陷阱?
  • @HRJ 抱歉,我找不到该线程的存档版本。但是没有任何问题,消息队列确保您不必担心竞争条件。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-04
  • 1970-01-01
  • 2014-02-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多