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

jas*_*as7 18 javascript firefox html5 google-chrome web-worker

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

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

aps*_*ers 19

简短回答:此行为是实现定义的,并且规范允许行为在浏览器之间变化(或在一个浏览器内的情境变化),除了对事件队列的某些保证.

答案很长:

关闭或导航离开页面会导致浏览器丢弃页面的文档:

用户代理可以在任何时间丢弃顶级浏览上下文(通常,响应于用户请求,例如当用户关闭包含一个或多个顶级浏览上下文的窗口时).

W3C规范工人说,工人有一个"列表Document的".对于由具有window(即不是工作者)Document的网页生成的工作人员,该列表包含产生它的单个页面.规范继续说:

每当Document丢弃一个对象时,它必须从Documents列表包含该Document的每个worker的worker的列表中删除.

还有:

如果工人的工作清单Document不是空的,则称工人是允许的工人.

稍后使用此定义:

关闭孤儿工作者:开始监视工作人员,以便......不迟于它不再是允许的工作人员,工作人员全局范围的结束标志设置为true.

最后,"结束标志"阻止了对工人的新活动:

一旦WorkerGlobalScope的关闭标志设置为true,事件循环的任务队列必须丢弃将添加到它们的任何其他任务(队列中已有的任务除非另有指定,否则不受影响).实际上,一旦结束标志为真,定时器就会停止触发,所有挂起的异步操作的通知都会被丢弃等.

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

用户代理可以在任何时间调用工作者的"杀死工作者"处理模型,例如响应于用户请求,响应CPU配额管理,或者如果工作者在工作者继续执行后停止成为活动需要的工作者它的结束标志设置为true.

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

共享工作者遵循完全相同的规则,除了他们的Documents 列表包括Documents当前正在使用它们的所有规则,因此它们的结束标志仅在所有Documents已关闭之后设置.

  • 2018年这个信息一直很难找到. (6认同)
  • 你知道Firefox或Chrome如何选择"在页面关闭后处理长时间运行的工作人员任务"吗?如果工作人员的任务是发送一个非常快速的POST请求,对于这种情况,浏览器是否在页面关闭后立即终止工作者,或浏览器是否允许工作人员完成其POST请求? (4认同)