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

Другие вопросы по тегам