gpt4 book ai didi

javascript - 网络 worker 突然终止

转载 作者:数据小太阳 更新时间:2023-10-29 04:10:16 26 4
gpt4 key购买 nike

我在 chrome 上启动了一个 web worker,它有一个使用 setTimeout 重复调用的简单函数。令人惊讶的是,网络 worker 在该函数被调用大约 1000 次后终止。谁能解释为什么?我猜 chrome 正在做一些优化。

webworker.js

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

ma​​in.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
};

编辑:在 fiddle 中转载: http://jsfiddle.net/meovfpv3/1/onmessage 回调停止触发似乎需要任意长的时间,快则几秒,长则 +5 分钟

最佳答案

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

如果主线程无法在 1 毫秒内处理完该消息,即使它尚未处理完上一条消息,您仍在向其发送一条新消息。我想这会将其放入等待处理的消息队列中。

现在,由于您从 web worker 发送消息的速度超过了处理消息的速度,因此未处理消息的队列将变得越来越大。在某些时候,Chrome 会举手说“队列中的消息太多”,它不会将新消息排队等待处理,而是将其丢弃。

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


我创建了一个 jsFiddle,其中工作线程向主线程发送消息,主线程将消息发送回工作线程。如果在发送下一条消息之前没有发生该过程,则两个线程中的计数器将不匹配,网络 worker 将终止。

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

您可以看到,合理的 setTimeout 为 100 毫秒,在下一条消息出现之前,所有消息都有足够的时间进行处理。

当您将 setTimeout 降低到 1 毫秒时,消息链在发送下一条消息之前没有时间完成,并且每个线程中的计数器最终变得不同步,从而触发 if 子句并终止网络 worker 。


解决此问题的一种方法是,不要盲目地每 1 毫秒发布一条消息,无论最后一条消息是否已被处理,只有在您从主线程收到一条返回消息后才发布一条新消息。这意味着您发布消息的速度与主线程处理消息的速度一样快。


为了完整起见,这里有一个 JSFiddle code 的副本:

worker :

  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);
}

关于javascript - 网络 worker 突然终止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37099465/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com