假设我有一个名为Main.html的页面,它创建了一个Web工作者。如果我通过更改window.location来关闭主页面,是否会终止Web工作者或Web工作者是否仍在运行?
Firefox或Chrome如何选择“在页面关闭后处理长时间运行的工作人员”?如果工作人员的任务是发送一个非常快的POST请求,对于这种情况,浏览器是否在页面关闭后立即终止工作者,或浏览器是否允许工作人员完成其POST请求?
答案 0 :(得分:18)
简短回答:此行为是实现定义的,并且规范允许行为因浏览器而异(或在一个浏览器内异地改变),除了对事件队列的某些保证。
答案很长:
关闭或导航离开页面会导致浏览器discard the page's document:
用户代理可以随时丢弃顶级浏览上下文(通常,响应用户请求,例如当用户关闭包含一个或多个顶级浏览上下文的窗口时)。
W3C Worker spec表示工人有“Document
s列表”。对于由具有window
(即不是工作者)的网页生成的工作人员,该列表由生成它的页面的单个Document
组成。规范继续说:
每当丢弃
Document
对象时,必须从列表中包含该文档的每个工作者的工作者Documents
列表中删除它。
还有:
如果工人的
Document
列表不为空,则称工人为允许的工作人员。
以后使用此定义:
关闭孤儿工作人员:开始监视工作人员,以便......不迟于它不再是允许的工作人员,工作人员全局范围的结束标志设置为true。
最后,“结束标志”阻止了对工人的新活动:
一旦WorkerGlobalScope的关闭标志设置为true,事件循环的任务队列必须丢弃将添加到它们的任何其他任务(队列中已有的任务除非另有指定,否则不受影响)。实际上,一旦结束标志为真,定时器就会停止触发,所有挂起的异步操作的通知都会被删除等等。
浏览器可能会暂停任何仍在运行的旧的长时间活动,但不一定是:
用户代理可以随时调用工作人员的“杀死工人”处理模型,例如响应用户请求,响应CPU配额管理,或当工作人员停止成为活动所需工作者,如果工作人员即使在其关闭标志设置为true后仍继续执行。
因此,W3C规范允许worker继续运行,但不允许它处理任何其他事件(工作者消息,定时器,网络通信回调等)。出于性能原因,特定浏览器可能会随时选择杀死该工作人员。页面关闭后,每个浏览器选择处理长时间运行的Worker任务的方式超出了规范的范围;它是实现定义的。你不应该以这种或那种方式依赖这种行为:你应该容忍立即终止,并且还应该容忍任何长期运行的任务不立即终止页面的关闭。
共享工作人员必须遵守完全相同的规则,但他们的Document
列表包含当前正在使用它们的所有Documents
,因此仅在所有Documents
之后设置其关闭标记已关闭。