我了解到,cpu密集型任务应该从服务器中移出,服务器应该负责与客户端对话并快速响应,而不是真正发送批处理电子邮件,或以一定质量计算数据库中的用户或调整图像大小等。
如果没有做到这一点,我怎么能让我的nodejs保持联系并控制nodejs代码之外的进程呢。
例如,
用户上传了一百万行的大csv文件。
我想分析一下并返回。
我可以让用户等待nodejs进行分析并返回结果。
如果有3000个用户,事件循环的所有优势都会消失。
那么我该怎么处理呢。
我读到我应该让其他外部流程来处理这个,怎么办?这些过程可以用更好更快的语言编写吗。如果我想将进度流式传输到客户端(30%),这将需要进程和nodejs之间的通信。
如果我能弄清楚的话,我认为GO和Nodejs是最好的组合。
在Node中,如果需要执行CPU密集型工作,则应使用child_process
。这将使主进程在分析CSV时可以继续自由处理请求和响应客户端。
当然,对于3000个用户来说,你不想生成3000个单独的进程,因为这不会扩展,所以在构建Node应用程序时,设计如何控制/创建子进程都应该是考虑因素。
如果要报告进度,可以使用父进程和子进程之间的消息,通过child.send()
(父级到子级通信)和process.send()
(子级到父级通信)来通信CSV分析的状态。有关父进程和子进程之间的通信,请参见节点文档中的此示例。
1)利用回调,通过调度回调将CPU密集型任务分配给线程池。
2) 如果你想提高CPU利用率,就要使用子进程,因为一个节点进程绑定到一个核心,即使你的机器中有多个核心,你也永远无法充分利用你的机器,除非你产生子进程。
3) 说到子进程,要管理多个子进程,请使用集群api根据机器的核心派生新进程。
因此,基本上nodejs逻辑说,让主线程忙于向不执行自己的线程池调度任务。