NodeJs как создать неблокирующее вычисление

Я пытаюсь понять, как создать неблокирующую часть тяжелых вычислений в nodejs. Возьмем этот пример (без прочего):

http.createServer(function(req, res) {
    console.log(req.url);
    sleep(10000);
    res.end('Hello World');
}).listen(8080, function() { console.log("ready"); });

Как вы понимаете, если я открываю 2 окна браузера одновременно, первое будет ждать 10 секунд, а другое, как и ожидалось, 20. вооружившись осознанием того, что обратный вызов является каким-то образом асинхронным, я удалил сон и поставил вместо него следующее:

doHeavyStuff(function() {
    res.end('Hello World');
});

с просто определенной функцией:

function doHeavyStuff(callback) {
    sleep(10000);
    callback();
}

это, конечно, не работает ... Я также попытался определить EventEmitter и зарегистрировать к нему, но основная функция Emitter имеет внутри засыпание перед выдачей, например, «готово», так что снова все будет работать в блоке.

Мне интересно, как другие люди писали неблокирующий код ... например модуль mongojs или child_process.exec не блокируются, что означает, что где-то в коде они либо разветвляют процесс на другом er thread и слушайте его события. Как я могу воспроизвести это в методе, который, например, имеет длительный процесс?

Я полностью неправильно понимаю парадигму nodejs? : /

Спасибо!

Обновление: решение (вроде)

Спасибо за ответ Линусу, действительно, единственный способ - создать дочерний процесс, например, другой скрипт узла:

http.createServer(function(req, res) {
    console.log(req.url);

    var child = exec('node calculate.js', function (err, strout, strerr) {
        console.log("fatto");
        res.end(strout);
    });

}).listen(8080, function() { console.log("ready"); });

Calcul.js может не торопиться, чтобы сделай то, что ему нужно, и вернись.Таким образом, несколько запросов будут выполняться параллельно, так сказать.

17
задан Tallmaris 3 March 2012 в 20:57
поделиться