Подтвердить что ты не робот

Путаница в отношении интенсивного кода ЦП в 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?

Если это так: мой лучший вариант по-прежнему использовать дочерние процессы, как предложено в этом вопросе?

Извините заранее за отсутствие ясности.

4b9b3361

Ответ 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 или выполнить свою работу в отдельном процессе. Но это должен быть ДЕЙСТВИТЕЛЬНО интенсивный код;)