Я пытаюсь понять, как создать неблокирующую часть тяжелых вычислений в 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 может не торопиться, чтобы сделай то, что ему нужно, и вернись.Таким образом, несколько запросов будут выполняться параллельно, так сказать.