Путаница с интенсивным использованием процессора в Node.js
Вопрос о том, что "все работает параллельно, кроме вашего кода" от кого-то новичка в Node.js. Это явно искусственный пример, но, скажем, я хочу создать математическую библиотеку, содержащую функцию factorize()
который ведет себя следующим образом:
var http = require('http');
http.createServer(function (req, res) {
myMath.factorize(some_big_number,function(factors) {
res.writeHead(200, {'Content-Type': 'application/json'});
res.end(JSON.stringify(factors));
}
}).listen(8000);
Как это можно написать так, чтобы он "работал параллельно"?
Я рассматривал код синтаксического анализа из этой библиотеки как пример, который может занять некоторое время обработки. Считается ли тело кода "вашим кодом" или "работает параллельно"?
Если нет: что мне нужно делать при написании factorize()
чтобы он тоже не блокировал / вел себя как клиент? Достаточно ли использовать EventEmitter?
Если так: мой лучший вариант все еще использовать дочерние процессы, как предложено в этом вопросе?
Заранее извиняюсь за отсутствие ясности.
3 ответа
На самом деле вы не можете запустить его "параллельно" (если вы не используете рабочий модуль), так как JavaScript в node.js выполняется в одном потоке, но вы можете разбить ваш отдельный поток на более мелкие части. Например с process.nextTick
поэтому, когда процессор выполняет код в виде небольших кусков вместо одного долго выполняющегося кода, у него есть небольшие перерывы для выполнения других задач.
myLongRunningCode(callback){
do_a_piece_of_the_work();
if(ready){
callback();
}else{
// give the CPU a small break to do other things
process.nextTick(function(){
// continue working
myLongRunningCode(callback);
});
}
}
Чтобы написать неблокирующий код, вы должны сделать передачу сообщений.
Для передачи сообщений вы должны открыть поток и пропустить через него сообщения. Это включает в себя разговор с каким-то другим процессом или разговор с подпроцессом.
Вы можете создать дочерние процессы, которые будут выполнять тяжелую работу за вас в узле, или вы можете создать tcp/ веб-сервис, который сделает за вас тяжелую работу. Просто сделайте так, чтобы узел передавал им сообщения, а затем отправлял данные по вашему ответу, когда внешние процессы сделали тяжелую работу.
Весь ваш JS-код НЕ может работать параллельно. Никогда не выполняется несколько функций одновременно. Код с интенсивным использованием процессора сделает вашу программу неспособной сделать что-то еще, пока этот код не закончится.
Я рекомендую вам разделить ваш код с помощью setTimeout или выполнить свою работу в отдельном процессе. Но это должен быть ДЕЙСТВИТЕЛЬНО интенсивный код;)