如何避免在node.js中阻塞主线程?

时间:2011-08-02 12:12:52

标签: node.js

使用node.js编写Web服务器应用程序时,永远不要阻塞主线程当然非常重要。但是,如果服务器请求需要进行需要一些时间才能完成的计算呢?

会做一个

setTimeout(myCalculationFunc(), 0);

是保持服务器响应其他请求的最佳方式吗?

3 个答案:

答案 0 :(得分:4)

我创建了一个简单的例子,使用child_process进行大量计算,如果你想使用它。

你可以这样做:

var http = require("http"),
exec = require("child_process").exec;

http.createServer(function(request, response) {
    var endvalue;
    request.on('data',
    function(data) {
        endvalue = data;
    });
    request.on('end',
    function() {
        exec("node calculate.js "+endvalue,
            function (error, stdout, stderr) {
              response.writeHead(200, {"Content-Type": "text/plain"});
              response.write(stdout);
              response.end();
            });
    });
}).listen(8080);

Calculate.js:

var endvalue = process.argv[2];
    for (i=0;i<=endvalue;i=i+1)
    {
        //just keeping it busy
    }
console.log("FINISHED USING ENDVALUE: "+endvalue);

答案 1 :(得分:2)

  

但是,如果服务器请求需要进行需要一些时间才能完成的计算呢?

node.js背后的整个想法是它没有做任何繁重的处理。任何繁重的处理都应由工人处理。

您需要尽快回到事件循环并生成进程或使用IO来完成繁重的工作。

实际的node.js服务器只需要将消息传递给您的所有服务,而不是执行任何这些服务。

答案 2 :(得分:1)

另一种可能性是使用WebWorkers模块。它不像

那么简单

background(func, succ, fail)

但它并不太远。