Путаница в отношении кода, интенсивно использующего ЦП в 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?

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

Заранее приносим свои извинения за отсутствие ясности.


person YXD    schedule 19.04.2011    source источник
comment
У меня нет ответа, но я понимаю вопрос, поэтому я полагаю, что для большинства людей он достаточно ясен. :)   -  person zneak    schedule 19.04.2011


Ответы (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);
        });
    }
}
person Andris    schedule 19.04.2011
comment
Я бы также рекомендовал использовать process.nextTick внутри рекурсивных функций или циклов, чтобы у вас было много небольших перерывов. - person Raynos; 19.04.2011

Чтобы написать неблокирующий код, вам нужно выполнить передачу сообщений.

Для передачи сообщений вам необходимо открыть поток и передавать через него сообщения. Это включает разговор с каким-либо другим процессом или разговор с подпроцессом.

Вы можете создать дочерние процессы, которые будут выполнять тяжелую работу за вас в узле, или вы можете создать tcp / веб-сервис, который сделает тяжелую работу за вас. Просто заставьте узел передавать им сообщения, а затем отправьте данные в свой ответ, когда внешние процессы сделают всю тяжелую работу.

person Raynos    schedule 19.04.2011

весь ваш код JS НЕ МОЖЕТ работать параллельно. Не допускается одновременное выполнение нескольких функций. Код с интенсивным использованием ЦП сделает вашу программу неспособной делать что-либо еще, пока этот код не закончится.

Я рекомендую вам разделить код с помощью setTimeout или выполнить свою работу в отдельном процессе. Но это должен быть ДЕЙСТВИТЕЛЬНО интенсивный код;)

person Van Coding    schedule 19.04.2011
comment
он говорит о сервере и отвечает на запросы, поэтому он работает параллельно. - person fazo; 19.04.2011