【发布时间】: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