当业主不在焦点时,网络工作者会做什么?

时间:2016-04-28 15:10:43

标签: javascript ajax web-worker

[编辑:这个问题可能需要更窄的范围,所以当我注意到这一点时,我会说我目前正在使用Chrome 49.0.2623.112 m(64位)默认设置。我目前正在使用HTTPS,但我在切换之前就观察过它。]

我有一个应用程序,可以将AJAX轮询到Web worker。它在性能方面并不是一个令人难以置信的节省,但它使应用程序更容易推理并具有未来性能优势的潜力。

我向工作人员添加一个控制台日志记录行,以便每次发出XHR请求时都会告诉我。您可能知道,当重复的日志记录行进入Chrome时,Inspector会记录重复项的数量。

当我查看该页面时,我可以在控制台中看到:$dom = new DOMDocument(); // Load with no html/body tags and do not add a default dtd $dom->loadHTML($string, LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD); $string = $dom->saveHTML();

如果我有焦点页面,我会看到每个轮询间隔每2秒增加一次整数。

然而,

当我切换到另一个标签一段时间,然后返回时,该数字需要几秒钟才能更新,此时它只会更新一个。这可能是因为工作者实际上正在暂停,这在这个特定的应用程序中很好,或者可能是工作者仍然在运行但是如果父程序不可见,控制台API就无法从工作程序接收日志行。不确定。

但我要解决的重要事情是当我返回标签时的延迟。如果它是响应式更新仪表板,则在更新继续之前延迟10-60秒是显而易见的,并且是UI性能错误。

当所有者标签失去焦点时,是否有人能够了解网络工作者会发生什么?它实际上是在排队需要完成的每个工作实例(在XHR消息上),然后在所有者回来时进行吗?

手动暂停丢失焦点的轮询机制会有什么帮助吗?

2 个答案:

答案 0 :(得分:3)

此行为因浏览器而异。如果不使用选项卡,它们中的大多数将降低JavaScript优先级以保留CPU周期和性能开销。我相信有些浏览器完全暂停了标签执行,所以是的,它会暂停,直到重新开始。我认为Firefox可以选择控制它。

答案 1 :(得分:0)

WebWorkers与创建它们的页面紧密相关。默认行为是在WebWorker页面未处于活动状态时挂起它。

典型的问题场景是管理WebSocket的WebWorker。当执行暂停,接收消息但不处理消息时,该网络连接仍处于活动状态。这将导致WebSocket的内部网络缓冲区溢出 - 实质上是内存泄漏,这可能导致整个系统崩溃。

解决方案是使用SharedWorkers,它不是与创建它们的页面紧密绑定,而是设计为在页面之间操作,忽略焦点丢失。 WebSocket场景非常适合SharedWorker。

任何SharedWorker的用例都应该被很好地理解,因为它们一直在运行并且会影响其他页面和应用程序的性能。

现在去玩:http://coolaj86.github.io/html5-shared-web-worker-examples