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

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

会做一个

setTimeout(myCalculationFunc(), 0);

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

       

网上收集的解决方案 "如何避免阻塞node.js中的主线程?"

我创build了一个简单的例子,使用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); 

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

node.js背后的想法是它不会做任何重大的处理。 任何重处理都应该由工人来处理。

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

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

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

background(func, succ, fail)

但它不是太遥远。