请考虑以下代码和本 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/