为什么此请求处理函数阻止其他请求?

时间:2014-03-03 18:23:04

标签: node.js

我有以下请求处理程序,我认为它们应该是非阻塞的,但它们不是。如果我发送上传请求,即使它正在运行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'

由于

2 个答案:

答案 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.这是一个公平的理解吗?