【问题标题】:setInterval Stops After An Hour With ElectronsetInterval 在使用 Electron 一个小时后停止
【发布时间】:2020-01-02 02:54:40
【问题描述】:

希望有人可以在这里为我指明正确的方向。我的电子应用程序需要每 10 分钟左右执行一次 API 调用。我目前在渲染器进程中使用 setInterval 循环来执行此操作,该循环每 10 分钟触发一次。

它通常可以正常工作,几个小时后它似乎就停止了射击。我有几个进程可以清除并重新启动 setInterval 以尝试解决问题,但似乎没有任何效果。

该应用会打开新的浏览器窗口并显示内容,这意味着主窗口可能并非始终处于焦点状态,我怀疑这可能与此有关。

我已经尝试添加

powerSaveBlocker.start("prevent-display-sleep");
powerSaveBlocker.start("prevent-app-suspension");

到我的主要电子 js 脚本,但它似乎没有效果。问题主要出现在 Windows 机器上。我不完全确定它是发生在 Mac 还是 Linux 上。

所以我的问题是,有什么理由会发生这种情况,即间隔在一个点之后就消失了? powerSaveBlocker 调用对我来说很有意义,但它们似乎并没有真正做任何事情。

或者有没有更好的方法让后台进程在可以执行这些 API 调用的时间间隔运行?我看过node-schedule,但我不确定它是否能解决这个问题。

【问题讨论】:

  • 您能否发布一个最小但完整的示例来重现此行为?由于测试至少需要一个小时,这将有很长的路要走。另外,您使用的是最新的 Electron 版本吗?您是否尝试禁用webPreferences.backgroundThrottling
  • 有趣,我不知道那个设置。谢谢,让我试一试。也许将其发布为答案,以防万一它有效,以便我可以标记它。
  • 还要检查您的 Electron 版本,backgroundThrottling 中的 7.1.4 似乎发生了变化
  • 有趣,我目前在 5.0.6 上。谢谢@snwflk
  • 继@snwflk 的评论之后,似乎错误是直到 7.1.4 您无法关闭后台限制,这意味着计时器总是受到限制:github.com/electron/electron/issues/20974 这几乎可以肯定地解释了问题,也许 snwflk 可以发布那些 cmets 作为答案?

标签: electron


【解决方案1】:

在这里回答我自己的问题,感谢@snwflk,他在对原始帖子的评论中为我指出了正确的方向。

虽然我无法绝对肯定地澄清这可以解决问题,但我也没有看到过这个问题。 (它并不总是 100% 可重现的,而且它很难测试,因为它需要一台机器,单独放置几个小时,这可能会或可能不会显示问题)。

不过,我已经向一些客户推出了修复程序,他们的机器几天后似乎仍然在线,这是一个好兆头。

因此,解决方案是在主 BrowserWindow 对象上禁用 backgroundThrottling(间隔在渲染器进程中运行)

文档:https://electronjs.org/docs/api/browser-window#new-browserwindowoptions

一个例子

mainWindow = new BrowserWindow({
    webPreferences: {
        backgroundThrottling: false,
    },
});

请注意,有一些错误导致此设置无法正常工作,即https://github.com/electron/electron/issues/20974,因此请务必更新您的电子版本。

【讨论】:

    【解决方案2】:

    据我所知,间隔应该永远运行(MDN page 也没有提及任何内容)。

    如果我理解正确,您的 Electron 应用调用该 API?所以很难区分没有触发的间隔和导致冻结的其他问题?

    我的猜测是你有一个未捕获的异常被抛出,或者其他类似的错误或事件。 https://stackoverflow.com/a/43911292/841830 给出了一些建议。 https://github.com/sindresorhus/electron-unhandled 表示它可以在主进程和渲染器进程中使用,以捕获和报告所有问题。

    或者有没有更好的方法让后台进程每隔一段时间就运行一次以执行这些 API 调用?

    如果您在 Linux 上,使用 cron 运行节点脚本(甚至只是 wget 或 curl 命令)会比仅为此使用 Electron 应用程序更好。任务调度程序seems to be 相当于 cron 的 windows。

    【讨论】:

    • 感谢您的回复,该应用程序做了几件事,主要是在浏览器窗口上显示内容,间隔 API 调用是为了进行许可证检查并确保客户拥有有效的许可证。它不可能在应用程序之外执行此操作。我怀疑可能是因为主窗口前面有一个新的浏览器窗口,它可能使线程进入睡眠状态。我已经有异常处理和监控,没有被抛出。
    • @Cheyne 我刚看到 snwflk 的评论,backgroundThrottling(默认为 true)似乎是一个可能的原因,不是吗。
    • 是的,很有趣,不知道那个。我会试一试,看看效果如何。当我知道更多时,我会回复。
    猜你喜欢
    • 2011-01-13
    • 1970-01-01
    • 1970-01-01
    • 2017-06-30
    • 2012-02-26
    • 2012-12-20
    • 1970-01-01
    • 1970-01-01
    • 2016-11-01
    相关资源
    最近更新 更多