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