浏览器可以随时重新启动 Web Worker 吗?

Raú*_*ado 2 javascript web-worker

我在很多地方(包括这里,在 Stack Overflow 中)读到,网络工作者可以随时被浏览器杀死并重新启动。好吧,“随时”可能意味着“只要它们正在做某事”,但问题是它们可以在没有事先警告的情况下被浏览器杀死并重新启动,从而丢失存储在globalThis.

但在我的一生中,我无法在规范中找到这一点,这让我很担心,因为我实际上使用的是 Web Worker,其正常功能依赖于将一些信息数据保存在全局变量中,以在消息处理调用之间保持最小状态功能。

这个 Web Worker 的工作方式就像一个魅力,并且状态会被保留,除非页面刷新,但我担心如果浏览器决定重新启动 Web Worker,应用程序可能会失败,并且如果发生这种情况肯定会失败。

我已经在谷歌上搜索过这个问题,特别是寻找示例和替代方案来重写我的网络工作者,而不需要全局状态,但我没有找到任何相关的内容。

谁能给我一些关于这方面的官方信息?

Kai*_*ido 5

我在很多地方(包括这里,在 Stack Overflow 中)读到,网络工作者可以随时被浏览器杀死并重新启动。

不,他们永远不会以任何方式重新启动您的(专用)工作人员。

浏览器可以杀死一个 Worker,如果

  • 主要导航(又名“页面”)被杀死。
  • Worker#terminate()方法已被调用。
  • DedicatedWorkerGlobalScope#close()方法已被调用,当前任务已完成。
  • 工人成为“孤儿”。当它不再是“受保护的工人”时,可能会发生这种情况,即
    • 当 Worker 是子 Worker(本身是从 Worker 创建的)并且其所有者已被杀死时,
    • 或者当它没有计划任务、没有正在进行的网络请求或数据库事务、并且没有MessagePort或内部Worker对象容易从外部接收消息时。

因此,只要您Worker在主线程中保留对对象的引用,并且不将自己称为关闭方法之一,Worker 就不可能被浏览器杀死。


注意:SharedWorkers、ServiceWorkers 和其他 Worklet 的规则都不同,此答案仅处理从new Worker().