3

假设我们有一位网络工作者引用名为“worker.js”的文件。我们使用worker来执行“worker.js”中执行一些冗长操作的功能。我们向工作人员发送相应的消息并在主线程中继续。但是,在工作人员完成其初始工作之前,主线程会向其发送另一条消息。在网络工作人员仍在运行时向其发布消息

我的问题:工作人员是否会继续使用我们的计时功能,并且只处理新发布的消息,或者是否会中断当前的操作直到新的消息完成?

+0

挂钩https://stackoverflow.com/q/3177774/632951 – Pacerier

回答

2

我已经尝试了在谷歌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”输出。

0

Web Worker由单个线程支持。这意味着当“onmessage”处理程序正在执行时,它将不能再接收另一个“onmessage”事件,直到前一个事件完成。

如果我们想要实现一些我们希望能够暂停和恢复的背景计算过程,这是非常不方便的,因为没有办法向正在运行的工作人员发送“暂停”消息。我们可以通过worker.terminate()来阻止网络工作者,但是这完全杀死了工作者。

我能想到的唯一方法是通过切片工人执行成块,然后从在每个组块,然后触发消息工人的端发布消息工人以处理下一个数据块, 等等。

相关问题