如何构build节点应用程序来处理CPU密集型任务?
我了解到cpu密集型任务应该移出服务器,服务器应该负责与客户交谈,快速响应,而不是真正发送批量电子邮件,或者以一定质量或调整图像大小来计算数据库中的用户。
所以没有这样做,我怎么能让我的nodejs保持联系和控制nodejs代码之外的进程。
例如,
用户上传一百万行大csv文件。
我想分析它并返回。
我可以让用户等待nodejs来分析并得到结果。
如果有3000个用户可以工作但没有规模,事件循环的所有优点都出来了。
那我该如何处理呢?
我读过,我应该让其他外部stream程来处理这个,怎么样? 这些过程是否可以用更好的语言来编写? 如果我想将stream程进行到客户端(30%)完成,这将需要进程和nodejs之间的通信。
我认为GO和Nodejs最好的组合,如果我能弄清楚这一点。
在Node中,如果您需要执行CPU密集型工作,则应该使用child_process
。 这将使主stream程免费继续处理请求,并在分析CSV时回应客户端。
当然,对于3000个用户,您不希望产生3000个单独的进程,因为这不会扩展,因此devise如何控制/创buildsubprocess时,应该在构buildNode应用程序时考虑所有因素。
如果要报告进度,则可以使用父进程和subprocess之间的消息,通过child.send()
(Parent to Child Communication)和process.send()
(Child to Parent Communication)来传递CSV分析的状态。 从“节点文档”中查看此示例以了解父级和子级进程之间的通信。
1)利用callback,通过调度callback将CPU密集型任务分配给线程池。
2)如果你想获得更多的CPU利用率,利用subprocess,因为即使你的机器有多个核心,一个节点进程绑定到一个核心,你将永远无法利用机器的全部能力,除非你产卵subprocess。
3)说到subprocess,为了pipe理多个subprocess,使用cluster api根据机器的核心来分叉新进程。
所以基本上nodejs逻辑说保持主线程繁忙的调度任务到线程池不执行自己。