我看过一些较旧的帖子涉及这个主题,但我想知道当前的现代方法是什么。
用例是:(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(使用前将#替换为@)