假设我们有一个Web工作者引用一个名为“worker.js”的文件。我们使用worker在“worker.js”中执行一个执行一些冗长操作的函数。我们将相应的消息发布给工作者并在主线程中继续。但是,在工作人员完成初始工作之前,主线程会向其发送另一条消息。
我的问题:工作人员是否会继续执行我们的计时功能,并且只会在完成后处理新发布的消息,还是会中断当前的操作直到新的消息完成?
答案 0 :(得分:4)
我已经在Google 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
每次重复迭代都会重新计算余弦变量,以提供&#34;时间拍摄&#34;问题中描述的算法。 显然,只有在最后一次操作完成后才会收到消息,因为我观察了&#34; xyz&#34;在10000th&#34; hello world&#34;之后立即打印输出。输出
答案 1 :(得分:1)
Web Worker由单个线程支持。这意味着当“onmessage”处理程序正在执行时,它将无法接收另一个“onmessage”事件,直到上一个事件完成。
如果我们想要实现一些我们希望能够暂停和恢复的后台计算过程,这是非常不方便的,因为无法向正在运行的工作人员发送“暂停”消息。我们可以通过worker.terminate()来阻止Web工作者,但这会完全杀死工作者。
我能想到的唯一方法是将工作程序执行切成块,然后在每个块的末尾发布来自的消息,然后触发消息到处理下一个块的工人,依此类推。