Я пытаюсь разобраться с созданием неблокирующего фрагмента тяжелых вычислений в 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 находится в спящем режиме перед тем, как выдать 'done', так что снова все будет работать блок.
Мне интересно, как другие люди пишут неблокирующий код ... например, модуль mongojs или child_process.exec не блокируют, что означает, что где-то внизу кода они либо форкируют процесс в другом потоке, и слушать его события. Как я могу воспроизвести это в методе, который, например, имеет длительный процесс?
Полностью ли я неправильно понимаю парадигму 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"); });
Calculate.js может занять некоторое время, чтобы сделать то, что ему нужно, и вернуться. Таким образом, несколько запросов будут выполняться параллельно, так сказать.