如何构建节点应用程序来处理cpu密集型任务



我了解到,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逻辑说,让主线程忙于向不执行自己的线程池调度任务。

最新更新