Я пытаюсь создать вокруг себя неблокирующий кусок тяжелых вычислений в nodejs. Возьмите этот пример (лишенный других вещей):
http.createServer(function(req, res) {
console.log(req.url);
sleep(10000);
res.end('Hello World');
}).listen(8080, function() { console.log("ready"); });
Как вы можете себе представить, если я открою сразу два окна браузера, первый будет ждать 10 секунд, а другой будет ждать 20, как и ожидалось. Итак, вооружившись тем, что обратный вызов каким-то асинхронным образом, я удалил сон и вместо этого поставил его:
doHeavyStuff(function() {
res.end('Hello World');
});
с просто заданной функцией:
function doHeavyStuff(callback) {
sleep(10000);
callback();
}
что, конечно, не работает... Я также попытался определить EventEmitter и зарегистрировать его, но основная функция Emitter имеет сон внутри, прежде чем выпустить "done", например, так что все будет работать блок.
Мне интересно, как другие люди писали неблокирующий код... например, модуль mongojs, или child_process.exec не блокируются, а это значит, что где-то в коде либо они развивают процесс в другом потоке, слушать его события. Как я могу воспроизвести это в методе, который, например, имеет длительный процесс?
Я полностью недопонимаю парадигму nodejs?:/
Спасибо!
Обновление: решение (вроде)
Спасибо за ответ Linus, действительно единственный способ - создать дочерний процесс, например, еще один node script:
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"); });
Calc.js может занять свое время, чтобы сделать то, что ему нужно, и вернуться. Таким образом, несколько запросов будут выполняться параллельно, так сказать.