我有以下请求处理程序,我认为它们应该是非阻塞的,但它们不是。如果我发送上传请求,即使它正在运行child_process,它也会阻止其他请求。我做错了什么?
var exec = require("child_process").exec;
function upload(response) {
console.log(new Date().toISOString() + ": Request handler 'upload' was called.");
exec("echo 'Hello Upload'", function (error, stdout, stderr) {
function sleep(milliSeconds) {
var startTime = new Date().getTime();
while (new Date().getTime() < startTime + milliSeconds);
}
sleep(10000);
response.writeHead(200, {"Content-Type": "text/plain"});
response.write(stdout);
response.end();
console.log(new Date().toISOString() + ":" + stdout);
});
console.log(new Date().toISOString() + ": Request 'upload' dispatched.");
}
这是日志:
2014-03-03T18:19:33.615Z: Request handler 'upload' was called.
2014-03-03T18:19:33.631Z: Request 'upload' dispatched.
2014-03-03T18:19:43.641Z:'Hello Upload'
由于
答案 0 :(得分:0)
你正在回调,而不是子进程;
exec("echo 'Hello Upload'", function (error, stdout, stderr) {
...
sleep(10000);
...只会在子进程中运行echo 'Hello Upload'
,当echo完成后,它将终止进程并在事件线程上回调睡眠状态。这将阻止事件循环并导致整个程序阻塞。
答案 1 :(得分:0)
我在评论中对你的问题的回答超过50个字符,所以,我把它放在一个与事实并不相符的答案中。
别介意功能名称。这是我在Manuel Kiessling的“Node.js初学者”一书中的一个例子。这不适用于实际应用。我只是想学习Node.js的非阻塞功能。我对回调函数感到困惑,并将忙循环放在那里以模拟CPU密集型应用程序。
据我所知,没有办法向线程调度CPU密集型功能。您必须在Node.js自己的事件循环中运行它(并阻止所有内容),或者作为Java或本机应用程序在单独的child_process中运行它,并在exec()中以非阻塞方式运行它。 Node.js提供的唯一非阻塞功能是I / O.这是一个公平的理解吗?