如何避免阻塞node.js中的主线程?
当用node.js编写Web服务器应用程序时,永远不要阻塞主线程是非常重要的。 但是如果一个服务器请求需要做计算,需要一些时间才能完成呢?
会做一个
setTimeout(myCalculationFunc(), 0);
成为保持服务器响应其他请求的最佳方式?
我创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)
但它不是太遥远。