Путаница в отношении интенсивного кода ЦП в 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);
Как это можно записать так, чтобы он "работал параллельно"?
Я рассматривал код анализа от эту библиотеку в качестве примера, который может занять некоторое время обработки. Является ли тело code считаться "вашим кодом" или это "работает параллельно"?
Если нет: что мне нужно делать при написании factorize()
, чтобы он также не блокировал/вел себя как клиент? Достаточно ли использовать EventEmitter?
Если это так: мой лучший вариант по-прежнему использовать дочерние процессы, как предложено в этом вопросе?
Извините заранее за отсутствие ясности.
Ответы
Ответ 1
На самом деле вы не можете запустить его "параллельно" (если вы не используете рабочий модуль), поскольку 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);
});
}
}
Ответ 2
Чтобы написать неблокирующий код, вам необходимо выполнить передачу сообщений.
Для передачи сообщений вам нужно открыть поток и передать через него сообщения. Это включает в себя разговор с каким-либо другим процессом или разговор с подпроцессом.
Вы можете создать дочерние процессы, чтобы сделать тяжелую работу для вас в node, или вы можете создать службу tcp/web, чтобы сделать тяжелую работу для вас. Просто получите node, чтобы передать им сообщения, а затем отправить данные по вашему ответу, когда внешние процессы сделали тяжелую работу.
Ответ 3
весь ваш JS-код НЕ может запускаться параллельно. Одновременно выполняются несколько функций.
ЦП с интенсивным кодом сделает вашу программу неспособной сделать что-то еще, пока этот код не закончится.
Я рекомендую вам разделить свой код с помощью setTimeout или выполнить свою работу в отдельном процессе. Но это должен быть ДЕЙСТВИТЕЛЬНО интенсивный код;)