当前位置: 首页 > 知识库问答 >
问题:

服务工作者(或类似人员)内部的长时间运行的流程

柴嘉禧
2023-03-14

我有一个客户端JS应用程序,它使用IndexedDB来存储其状态。很好。但是,它有点慢,因为我经常从IndexedDB读写,这样当多个选项卡打开时,状态就不会变得不一致。

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

这似乎很好,只是我的应用程序的某些部分需要很长时间才能运行。我可以将状态(如“X%完成”)从服务人员传递到我的UI。但是,如果Firefox和Chrome运行超过30秒,它似乎都会杀死这个工人,这对我来说太短了。

有没有办法绕过这个限制?如果没有,有没有实现类似目标的想法?我认为共享工作者可以做到这一点,除了浏览器支持很差,我不认为现在服务工作者的势头会有所改善。

共有3个答案

高钱青
2023-03-14

正如你所说,你需要的正是共享工作。我不知道你为什么认为实现ServiceWorkers背后的动力阻止浏览器支持SharedWorkers。他们似乎是两种不同的野兽。

据我所知,当您的应用程序脱机时,ServiceWorkers应该用作您请求的代理,繁重的工作应该在WebWorkers和SharedWorkers中完成

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

谢英光
2023-03-14

我最终使用了一个共享的Worker。在不支持共享Worker的浏览器中,如Edge和Safari,我求助于Web Worker和一些黑客代码,让您一次只在一个选项卡中打开应用程序。

由于我90%的用户都使用Firefox或Chrome浏览器,我认为这并不是一个巨大的损失。

我还编写了一个库(除其他外)来规范共享worker和Web worker中使用的API,因此在这两种场景中运行的代码完全相同,唯一的区别是worker是用worker还是SharedWorker初始化的。

越雨泽
2023-03-14

关于服务工作者的Google文档告诉我们,使用服务工作者作为内存缓存是不可能的:

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

我的建议是继续使用服务人员将数据持久化到数据库,并使用localStorage在页面之间创建共享缓存。然后,进行更改的选项卡负责更新localStorage中的缓存并通过服务工作者持久化到IndexedDB。

 类似资料:
  • 我正在使用Service Worker创建一个渐进式Web应用程序,我正在使用Service Worker工具箱来缓存我的内容。Service Worker代码来缓存我的内容: 代码运行正常,因为我在控制台上没有看到任何错误。但是我如何检查是否从云前或上面配置的网址的图像正在缓存和从缓存本身渲染。

  • 我使用的是Activti版本6.0.0。 我想同步执行活动中的任务,但我有一个长时间运行的任务,可能需要20分钟来执行。我想在我的控制器中快速获得过程实例ID,而不考虑在bpmn中完成任务,所以我在bpmn文件中添加了一个中间计时器事件“0分钟”。 我已经开始执行一个进程,比如说processInstanceid p1。当时只有我再次启动这个进程,比如说使用processInstanceid p2

  • 我有一个简单的服务人员,在上向客户发布消息: 当我查看控制台日志时,很明显,事件侦听器是在服务人员发布消息之后注册的。尽管如此,事件侦听器仍然接收消息。 我怀疑这是因为消息是异步调度的: postMessage()计划仅在所有挂起的执行上下文完成后发送MessageEvent。例如,如果在事件处理程序中调用postMessage(),则该事件处理程序将在发送MessageEvent之前运行到完成,

  • 我正在拦截并从Service Worker缓存返回资源。根据谷歌Chrome开发工具,下载内容需要大约300-400毫秒。我在火狐中检查过,下载是即时的。 我预计下载时间会小得多,因为不涉及网络。我使用常用的函数截取: 我拦截并从缓存返回资源的方式是否有问题?

  • 对于长时间运行的活动,我们可以使用心跳来通知活动是正在运行还是已死。 我们有一个工作流,该工作流调用多个子工作流,其中包含一些基于父工作流生成的分组的参数。子工作流是长时间运行的工作流。 有没有办法让类似的检测信号从子工作流发送,因为这些工作流长时间运行,超时设置为几个小时?或者更确切地说,通知子工作流正在运行的方法是什么? 我们正在使用go-client来实现工作流程。

  • 我有一个压缩图像的任务,它在图像中使用了许多循环: 我在普通线程中运行此方法,如下所示: 或者在后台工作线程中运行 问题是:这种方法有时会出错,在接收无效输入时会导致无限循环。在这种情况下,它将永远运行,并损害CPU,即使当设备的屏幕关闭时,这会增加设备的温度(如果我使用工作线程,它还会阻止等待队列中的其他任务)。 我想我需要设置一个超时来终止长时间运行的任务。在正常Java线程中实现这一点的最佳