gpt4 book ai didi

javascript - 如果关闭创建该 Web Worker 的页面,Web Worker 会发生什么情况?

转载 作者:技术小花猫 更新时间:2023-10-29 12:14:51 26 4
gpt4 key购买 nike

假设我有一个名为 Main.html 的页面,它创建了一个网络 worker 。如果我通过更改 window.location 关闭主页,web worker 会终止还是会继续运行?

Firefox 或 Chrome 如何选择“在页面关闭后处理长时间运行的 Worker 任务”?如果 worker 的任务是发送一个非常快速的 POST 请求,对于这种情况,浏览器是在页面关闭后立即终止 worker 还是浏览器允许 worker 完成其 POST 请求?

最佳答案

简短回答:此行为是实现定义的,规范允许行为因浏览器而异(或在一个浏览器内因情况而异),但有关事件队列的一些保证除外。

长答案:

关闭或离开页面会导致浏览器 discard the page's document :

User agents may discard top-level browsing contexts at any time (typically, in response to user requests, e.g. when a user closes a window containing one or more top-level browsing contexts).

W3C Worker spec表示 Worker 有一个“Document 列表”。对于由带有 window 的网页生成的 worker(即,不是 Worker),该列​​表由生成它的页面的单个 Document 组成。规范接着说:

Whenever a Document object is discarded, it must be removed from the list of the worker's Documents of each worker whose list contains that Document.

还有:

A worker is said to be a permissible worker if its list of the worker's Documents is not empty.

后面会用到这个定义:

Closing orphan workers: Start monitoring the worker such that... no later than it stops being a permissible worker, worker global scope's closing flag is set to true.

最后,“关闭标志”会阻止 worker 上的新事件:

Once the WorkerGlobalScope's closing flag is set to true, the event loop's task queues must discard any further tasks that would be added to them (tasks already on the queue are unaffected except where otherwise specified). Effectively, once the closing flag is true, timers stop firing, notifications for all pending asynchronous operations are dropped, etc.

任何仍在运行的旧的、长时间运行的事件可能会被浏览器暂停,但不一定是:

User agents may invoke the "kill a worker" processing model on a worker at any time, e.g. in response to user requests, in response to CPU quota management, or when a worker stops being an active needed worker if the worker continues executing even after its closing flag was set to true.

因此,W3C 规范允许 worker 继续运行,但不允许它处理任何进一步的事件(worker 消息、计时器、网络通信回调等)。出于性能原因,特定浏览器可能会随时选择终止工作程序。每个浏览器选择在页面关闭后处理长时间运行的 Worker 任务的方式超出了规范的范围;它是实现定义的。您不应该以这种或其他方式依赖这种行为:您应该容忍立即终止,还应该容忍任何长时间运行的任务不会随着页面的关闭而立即终止。

Shared Workers 遵循完全相同的规则,除了它们的 Document 列表包括当前使用它们的所有 Documents,因此它们的关闭标志仅在所有Documents 已关闭。

关于javascript - 如果关闭创建该 Web Worker 的页面,Web Worker 会发生什么情况?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20084348/

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