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