我的 主线程 的 JS 代码:

$('body').on('click',function(){alert('click');});
var worker = new Worker('worker.js');
worker.addEventListener('message', function(e) {
        console.log(e.data);
});

以及 worker.js 中的代码
var n = 1;
while (true) {
  n++;
  postMessage(n);
}

我刚刚开始研究 Web workers 。他们应该不会阻塞 UI 并让您与之交互,而他们(工作人员)在单独的线程中运行以实现并行性。在实践中,我通过运行上述代码得到的是一个卡住的浏览器,对任何点击都没有响应。 Worker 通过输出数字来工作,但是 UI 的并行性和独立性在哪里?

我正在等待一些好的解释。

谢谢

最佳答案

您正在通过 postMessage() 从工作人员发送的消息淹没主线程。它们到达的速度可能比调度它们并记录它们的速度要快,因此主线程没有其他时间做太多事情。更改您的 postMessage 调用,使其仅在 500 毫秒后向主线程发送更新,并且您不会使主线程过载,从而允许它在消息之间执行其他操作。

例如,在 worker.js 中试试这个:

var n = 1;
var lastSend = Date.now();
var now;
while (true) {
  n++;
  now = Date.now();
  if (now - lastSend > 500) {
      lastSend = now;
      postMessage(n);
  }
}

而且,这只会每 500 毫秒执行一次最新计数的 postMessage,以防止尝试处理所有这些消息的主线程过载。

Worker 要独立于主线程运行,它实际上需要独立于主线程,执行独立的工作,而不是一直试图与其通信。它最适合用于大部分独立于主线程并且仅偶尔需要与主线程通信的计算密集型操作。

关于javascript - 关于 Web Workers 并行性,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35127009/

10-11 11:06