如果我关闭创建此Web Worker的页面,Web Worker会发生什么?

时间:2013-11-19 23:25:01

标签: javascript html5 google-chrome firefox web-worker

假设我有一个名为Main.html的页面,它创建了一个Web工作者。如果我通过更改window.location来关闭主页面,是否会终止Web工作者或Web工作者是否仍在运行?

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

1 个答案:

答案 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之后设置其关闭标记已关闭。