我正在从Node Beginner Book和随后的电子书购买中学习 node.js。在书中,Manuel Kiessling 解释了这样一行阻塞代码:
fs.readFileSync(blah);
将阻止整个节点进程和所有请求进入。这对于多用户网站来说真的很糟糕!
这是示例,Kiessling 使用:
exec("ls -lah", function( error, stdout, stderr ) {
response.writeHead(200, {"Content-Type": "text/plain"});
response.write(stdout);
response.end();
});
这是欺骗我的代码。他说,ls -lah
可以很容易地用更耗时的操作(如find / -name "*"
数据库查找)代替。我假设由于异步回调,昂贵的阻塞操作会以某种方式在后台显式运行。
所以我必须用这段代码来测试我的理论:
var http = require("http");
var url = require("url");
badSleep = function(ms) {
var now = new Date();
var finishAtDate = now.getTime() + ms;
console.log("CPU burning sleep for " + ms + " milliseconds");
while(new Date() < finishAtDate) {
// do nothing
}
};
asyncWrapper = function(callback) {
//badSleep(3000);
callback();
}
http.createServer(function(request, response) {
var pathname = url.parse(request.url).pathname;
console.log("Serve up " + pathname);
if (pathname == '/favicon.ico') {
response.writeHead(404);
response.end();
} else {
asyncWrapper(function() {
badSleep(3000);
response.writeHead(200, {"Content-Type": "text/plain"});
response.write("\nI was wrong " + new Date());
response.end();
});
}
}).listen(8888);
问题是,无论我把睡眠放在哪里,它仍然会阻塞节点事件循环。回调并不能解决阻塞问题。SO的好用户也在评论中告诉我这一点。
那怎么exec
做???我很困惑,所以我去查看了github 上的子进程代码。我发现exec
打电话了spawn
!!!它使一个子进程!谜团已揭开。异步代码并不能“解决”阻塞问题,但 spawn 可以。
这引出了我的问题。express 是否以某种方式解决了阻塞问题,还是您仍然需要担心它?