我有一个Angular webapp,可以打开我的服务器的websocket,服务器每秒都会向应用程序发送一个新的数据包。当应用程序中的websocket收到消息时,我会进行一些小的处理,然后在绘图中向用户显示数据。
当我更改标签时,似乎我的处理继续每秒发生一次,直到标签在后台时已经过了大约10分钟。然后,我的应用程序锁定。如果我将它留在前台,它最终会“回收”并每秒多次运行我的处理程序 - 就像函数调用排队一样。
这种行为似乎与Linux和Mac上的Chrome和Safari都一致。
有谁知道这里发生了什么?为什么后台处理会在一段时间后突然改变?
答案 0 :(得分:0)
这是最近的一项改变,旨在减少电池消耗。遗憾的是没有真正的退出,如果你的应用程序在后台运行,它将受到限制。有关article的更多详细信息,请详细说明Google开发者门户网站。
在Chrome 57中运送,基于预算的计时器限制是计时器对齐机制的进一步扩展,对后台计时器CPU使用量进行了额外限制。它的运作如下:
- 每个后台标签都有一个时间预算(以秒为单位),用于在后台运行计时器。
- 页面在后台10秒后会受到时间预算限制。
- 只有在时间预算为非负时,才允许计时器任务运行。
- 执行计时器后,从预算中减去其运行时间。 预算不断随时间再生(目前设定为每秒0.01秒的速率)。请注意,当Chrome收集有关限制行为的更多数据时,可以调整此预算重新生成率。
这种限制有许多自动豁免:
- 播放音频的应用程序被视为前景,不受限制。
- 具有实时连接的应用程序(WebSockets和WebRTC),以避免超时关闭这些连接。在这些情况下,仍然应用运行时间 - 每秒一次的规则。
您受影响的特定规则是:
具有实时连接的应用程序(WebSockets和WebRTC),以避免超时关闭这些连接。在这些情况下,仍然会应用运行时间 - 每秒一次的规则。