在节点中异步执行CPU繁重的HTTP请求

时间:2017-05-18 08:13:36

标签: javascript node.js

我有一个节点应用程序,它使用节点画布从文件生成点图图。

我遇到了阻止对方请求的问题。这些请求涉及CPU大量循环(长度接近100万)。

例如,我有一个请求对文件进行一些分析。这涉及循环一个长度为800k +的数组并计算平均值。

app.get('/api/get/statistics', function(req, res) {

    // Promise here which gets files and loops through and calculates mean

});

另一个请求循环遍历同一个数组并创建一个图形并返回到UI。

app.get('/api/canvas', function(req, res) {

    // creates the graph

});

他们自己,第一个请求大约需要40秒,第二个请求大约需要13秒。但是当我同时发出请求时,第二个请求将排队等待大约53秒(有时超时)。

有解决方法吗?我以为我可以使用子进程,可能使用this package。但似乎来自this question,单独的HTTP请求可能无法实现。

注意:我不想在同一个请求中执行这些操作。大部分时间我都会向' / api / canvas'端点创建不同的图形。所以我基本上想知道是否可以同时执行这些CPU大量请求?

1 个答案:

答案 0 :(得分:1)

将计算调度到另一个进程以使其异步并防止它像现在一样阻塞NodeJS线程。

一种方法是使用child_process.fork并通过child.send与之通信。如果子进程不是NodeJS进程,请通过其stdinstdout对请求和响应进行相应的通信,stderr以查找错误。