假设我们有一位网络工作者引用名为“worker.js”的文件。我们使用worker来执行“worker.js”中执行一些冗长操作的功能。我们向工作人员发送相应的消息并在主线程中继续。但是,在工作人员完成其初始工作之前,主线程会向其发送另一条消息。在网络工作人员仍在运行时向其发布消息
我的问题:工作人员是否会继续使用我们的计时功能,并且只处理新发布的消息,或者是否会中断当前的操作直到新的消息完成?
假设我们有一位网络工作者引用名为“worker.js”的文件。我们使用worker来执行“worker.js”中执行一些冗长操作的功能。我们向工作人员发送相应的消息并在主线程中继续。但是,在工作人员完成其初始工作之前,主线程会向其发送另一条消息。在网络工作人员仍在运行时向其发布消息
我的问题:工作人员是否会继续使用我们的计时功能,并且只处理新发布的消息,或者是否会中断当前的操作直到新的消息完成?
我已经尝试了在谷歌Chrome浏览器的调试器下面的代码:
worker.js:
var cosine;
self.onmessage = function(e) {
if (e.data.message == 0) {
for (var i = 0; i < 10000000; i++) {
cosine = Math.cos(Math.random());
if (i % 1000 == 0) console.log("hello world");
}
} else if (e.data.message == 1) {
console.log("xyz");
}
};
main.js:
var worker;
function main() {
worker = new Worker("js/worker.js");
worker.postMessage({message: 0});
setTimeout(xyz, 10);
}
function xyz() {
worker.postMessage({message: 1});
}
输出:
(10000 times) test.js:11 hello world
test.js:14 xyz
余弦变化能够重新计算每个新的迭代以提供问题中描述的“时间占用”算法。 显然,只有在最后一个操作完成时才收到消息,因为我观察到在第10000个“hello world”输出后立即打印了“xyz”输出。
Web Worker由单个线程支持。这意味着当“onmessage”处理程序正在执行时,它将不能再接收另一个“onmessage”事件,直到前一个事件完成。
如果我们想要实现一些我们希望能够暂停和恢复的背景计算过程,这是非常不方便的,因为没有办法向正在运行的工作人员发送“暂停”消息。我们可以通过worker.terminate()来阻止网络工作者,但是这完全杀死了工作者。
我能想到的唯一方法是通过切片工人执行成块,然后从在每个组块,然后触发消息到工人的端发布消息工人以处理下一个数据块, 等等。
挂钩https://stackoverflow.com/q/3177774/632951 – Pacerier