使用child_process的Nodej运行一个函数,直到它返回

时间:2016-09-04 00:23:22

标签: node.js express parallel-processing child-process

我想要这种结构;

express后端获取请求并运行一个函数,该函数将从不同的apis获取数据并将其保存到db。因为这可能需要几分钟,我希望它在我的Web服务器继续处理请求时并行运行。

因为这种情况我想要这个:

用户拥有仪表板,在应用程序开始从apis收集数据并为用户准备仪表板后,用户可以浏览站点,甚至可以关闭浏览器,但该功能必须运行,直到完成获取数据为止。完成后,所有数据都将保存为db,仪表板已准备好供用户使用。

我如何使用child_process或nodejs中的任何类型的结构?

1 个答案:

答案 0 :(得分:1)

由于您所描述的是所有异步I / O(网络或磁盘)并且不是CPU密集型,因此您无需多个子进程即可有效地为多个请求提供服务。这是node.js的美丽。使用异步I / O,node.js可以在相同的时间段内处理许多不同的请求。

假设您的过程中有一部分正在下载图片。您的node.js代码发送请求以获取图像。该请求通过TCP发送。立即,该请求没有别的办法。它正在向目标服务器发起攻击,而目标服务器正在准备响应。在所有这一切发生的同时,您的node.js服务器可以完全自由地从其事件队列中提取其他事件并开始处理其他请求。那些其他请求执行类似的操作(它们启动异步操作,然后等待事件稍后发生)。

您的服务器可能会启动10个不同的异步操作,并且#34;在飞行中"在第一个实际开始得到回应之前。当响应开始进入时,系统将事件放入node.js事件队列。当node.js在其他请求之间有一个时刻时,它会将下一个事件从事件队列中拉出并处理它。如果处理具有进一步的异步操作(如将其保存到磁盘),整个异步和事件驱动的进程将重新开始,因为node.js请求写入磁盘并且node.js再次可以自由地提供其他事件。通过这种方式,事件会在事件队列变为可用时一次从事件队列中拉出,并且可以在异步操作(其中有很多)之间的空闲时间内完成许多不同的操作。

唯一让苹果推车失望并且破坏node.js同时处理许多不同事物的能力的事情是一个占用大量CPU周期的操作(比如说一些异常重的加密)。如果你有这样的东西,它会" hog"太多的CPU和CPU无法在许多其他操作之间有效共享。如果是这种情况,那么您可能希望将CPU密集型操作移动到一组子进程。但是,只是执行异步I / O(磁盘,网络,其他硬件端口等)并不会占用CPU - 实际上它几乎没有使用很多node.js CPU。

所以,下一个问题通常是"我怎么知道我是否有太多使用CPU的东西"。真正了解的唯一方法是使用异步I / O正确编码服务器,然后在负载下测量其性能,看看情况如何。如果您正在适当地执行异步操作并且CPU仍然达到100%,那么您的CPU负载过多,并且您希望使用通用群集或将特定CPU耗费的操作移动到一组子级过程