如何构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逻辑说保持主线程繁忙的调度任务到线程池不执行自己。