【问题标题】:Long-running process inside a Service Worker (or something similar)Service Worker(或类似的东西)内的长时间运行的进程
【发布时间】:2016-12-29 03:19:41
【问题描述】:

我有一个使用 IndexedDB 存储其状态的客户端 JS 应用程序。工作正常。但是,它有点慢,因为我经常读取和写入 IndexedDB,以便在打开多个选项卡时状态不会变得不一致。

我的想法是...将所有数据库访问内容放在一个 Service Worker 中,然后我可以将值缓存在内存中,而不必担心另一个选项卡可能会更改数据库。

这似乎工作正常,除了我的应用程序的某些部分需要很长时间才能运行。我可以将状态(如“X% 完成”)从 Service Worker 传达给我的 UI。但是如果运行超过 30 秒,Firefox 和 Chrome 似乎都会杀死工人,这对我来说太短了。

有没有办法绕过这个限制?如果没有,有什么想法可以实现类似的目标吗?我认为 Shared Worker 可以做到这一点,只是浏览器支持很差,而且我不认为现在随着 Service Worker 的发展势头会有所改善。

【问题讨论】:

  • 您是否尝试在值发生更改时更新所有选项卡?
  • 有时是,有时不是。
  • 您是否尝试过使用localStoragestorage 事件?
  • 在这种情况下,我需要IndexedDB的特性和性能。
  • SharedWorker 不受 ie 支持,但其他 borwsers developer.mozilla.org/en-US/docs/Web/API/SharedWorker 支持。 SharedWorker 的性能会与 ServiceWorker 不同吗?

标签: javascript web-worker service-worker


【解决方案1】:

关于 Service Worker 的 Google 文档告诉我们,使用 Service Worker 作为内存缓存是不可能的:

它在不使用时终止,并在下次需要时重新启动,因此您不能依赖服务工作者的 onfetch 和 onmessage 处理程序中的全局状态。如果您需要在重新启动时保留和重用信息,服务工作者确实可以访问 IndexedDB API。

我的建议是继续使用 service worker 将数据持久化到数据库中,并使用 localStorage 创建一个shared cache between pages。然后,进行更改的选项卡负责更新 localStorage 中的缓存并通过 service worker 持久化到 IndexedDB。

【讨论】:

  • IndexedDB 中已经有数据了,多个标签页都可以访问... 就是这么多读写磁盘太慢了。 localStorage 可能会更慢,如果有的话。经过一番思考,我认为 SharedWorker 几乎正是我想要的解决方案,但 MS/Apple 永远不会支持它。
【解决方案2】:

我最终使用了 Shared Worker。在不支持 Shared Worker 的浏览器(例如 Edge 和 Safari)中,我会使用 Web Worker 和一些 hacky 代码,让您一次只能在一个选项卡中打开应用程序。

反正我 90% 的用户都在使用 Firefox 或 Chrome,我认为这不是一个巨大的损失。

我还 wrote a library (除其他外)标准化 Shared Workers 和 Web Workers 中使用的 API,因此我在两种情况下运行完全相同的代码,唯一的区别是工作程序是否使用 Worker 初始化或SharedWorker

【讨论】:

    【解决方案3】:

    正如您自己所说,SharedWorkers 似乎正是您所需要的。 我不确定您为什么认为实现 ServiceWorkers 背后的动力会阻止浏览器支持 SharedWorkers。他们似乎是两种不同的野兽。

    据我了解,当您的应用程序处于离线状态并且应该在 WebWorkers 和 SharedWorkers 中完成繁重的工作时,应该使用 ServiceWorkers 作为您的请求的代理

    https://developer.mozilla.org/en-US/docs/Web/API/Service_Worker_API https://developer.mozilla.org/en-US/docs/Web/API/SharedWorker

    【讨论】:

    • caniuse.com/#feat=sharedworkers Safari 曾经支持它,但删除了它。微软没有计划支持它。它与 Service Worker 是不同的野兽,但 Service Worker 有很大的发展势头,而且至少有一些用例重叠。
    猜你喜欢
    • 2023-03-27
    • 2011-01-28
    • 1970-01-01
    • 2011-05-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-30
    • 2010-10-26
    相关资源
    最近更新 更多