在 NodeJS 中处理长时间运行的进程?

2024-05-06

我看过一些较旧的帖子涉及这个主题,但我想知道当前的现代方法是什么。

用例是:(1) 假设您想要在视频文件上执行长时间运行的任务 ,例如 60 秒长,例如jspm install这最多可能需要 60 秒。 (2) 不能对任务进行细分。

其他要求包括:

  • 需要知道任务何时完成
  • 很高兴能够停止正在运行的任务
  • 稳定性:如果一个任务终止,不会导致服务器崩溃
  • 需要能够处理数百个并发请求

我见过提到的这些解决方案:

  • Node.js子进程
  • 网络工作者
  • optics - 不用于 CPU 密集型任务
  • generators - 不用于 CPU 密集型任务
  • https://adambom.github.io/parallel.js/ https://adambom.github.io/parallel.js/
  • https://github.com/xk/node-threads-a-gogo https://github.com/xk/node-threads-a-gogo
  • 还有其他人吗?

哪种是现代的、基于标准的方法?另外,如果 Nodejs 不适合此类任务,那么这也是一个有效的答案。


简短的答案是:取决于

如果你指的是nodejsserver,那么答案是否定的对于这个用例。 Nodejs 的单线程事件无法处理 CPU 密集型任务,因此将工作外包给另一个进程或线程是有意义的。然而,对于这种 CPU 密集型任务长时间运行的用例,找到某种对任务进行排队的方法是有意义的……即,使用工作队列是有意义的。

然而,对于运行 JS 代码的这个特定用例(jspm API),使用使用nodejs的工作队列是有意义的。因此,解决方案是:(1)使用一个nodejs服务器,它除了在工作队列中排队任务外什么也不做。 (2) 使用nodejs工作队列(例如kue)去做实际工作。使用cluster将工作分散到不同的 CPU 上。结果很简单,single服务器可以处理数百个请求(不会阻塞)。 (嗯,差不多了,看下面的注释...)

Note:

  • 上述解决方案使用流程。我没有研究线程解决方案,因为这些解决方案似乎已经不再受节点青睐。
  • 工作队列+集群给你相当于一个线程池.
  • 是的,在最坏的情况下,第 100 个并行请求在 4 核机器上需要 25 分钟才能完成。解决方案是启动另一个工作队列服务器(如果我没记错的话,使用数据库支持的工作队列,例如kue这很简单——只需让每个点服务器指向同一个数据库)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 NodeJS 中处理长时间运行的进程? 的相关文章

随机推荐