微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

javascript – 网络工作者突然终止

我在chrome上发起了一个web worker,它有一个简单的函数,使用setTimeout重复调用.令人惊讶的是,在调用函数大约1000次之后,Web worker终止了.有人可以解释为什么吗我猜chrome正在做一些优化.

webworker.js

function hi() {
    postMessage('1');
    setTimeout(hi,1);
}
hi();

main.js

var blob = new Blob([code]);
var blobURL = window.URL.createObjectURL(blob);
var worker = new Worker(blobURL);
worker.onmessage = function(data) {
    console.log(data.data); // gets called around 1000 times and done
};

编辑:
转载于小提琴中:
http://jsfiddle.net/meovfpv3/1/
对于onmessage回调停止射击似乎需要很长时间,只需几秒钟,长达5分钟

解决方法

这是我对正在发生的事情的最好猜测.通过每隔1ms从Web Worker发布一条消息,您要求主线程在1ms内处理每个发布的消息.

如果主线程无法在1ms内处理消息,即使未处理完最后一条消息,您仍然会向其发送新消息.我想这会将它放入等待处理的消息队列中.

现在,由于您从Web工作者发送的消息比处理它们的速度更快,因此未处理消息的队列将变得越来越大.在某些时候,Chrome会举手说“队列中有太多消息”,而不是排队新消息进行处理,它会丢弃它们.

这就是为什么如果在超时中使用合理的数字(如100ms),则在发送下一条消息之前,消息有足够的时间进行处理,并且不会出现未处理的消息问题.

我创建了一个jsfiddle,其中worker向主线程发送消息,主线程将消息发送回worker.如果在发送下一条消息之前未发生该过程,则两个线程中的计数器将不匹配,并且Web worker将终止.

http://jsfiddle.net/meovfpv3/3/

您可以看到,使用100ms的合理setTimeout,所有消息都有足够的时间在下一条消息发生之前进行处理.

将setTimeout降低到1ms时,消息链没有时间在发送下一条消息之前完成,并且每个线程中的计数器最终都会被删除,使if子句跳闸并终止Web worker.

解决此问题的一种方法是,不是每隔1ms盲目地发布一条消息,而不管最后一条是否已被处理,只有在从主线程收到消息后才发布新消息.这意味着您只是在主线程可以处理它们时发布消息.

为了完整起见,这里是JSFiddle code的副本:

工人:

var counter2 = 0;
  var rcvd = true;
  function hi() {
    counter2++;
    console.log("")
    console.log("postMessage",counter2)
    postMessage(counter2);
    if (!rcvd) {
        self.close();
      console.log("No message received");
    }
    rcvd = false;
    setTimeout(hi,1);
  }
  hi();
  onmessage = function(e) {
    rcvd = true;
    console.log("secondMessage",e.data);
  }

主要:

var ww = document.querySelector('script[type="text/ww"]'),code = ww.textContent,blob = new Blob([code],{type: 'text/javascript'}),blobUrl = URL.createObjectURL(blob),worker = new Worker(blobUrl),counter = 0;

worker.onmessage = function(e) {
    counter++;
  console.log("onmessage:",counter);
  worker.postMessage(e.data);
}

原文地址:https://www.jb51.cc/js/158801.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐