Путаница с интенсивным использованием процессора в Node.js - PullRequest
14 голосов
/ 19 апреля 2011

Вопрос о том, что "все работает параллельно, кроме вашего кода", задан кем-то новым для 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 ]

7 голосов
/ 19 апреля 2011

На самом деле вы не можете запустить его «параллельно» (если только вы не используете рабочий модуль ), так как 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);
        });
    }
}
3 голосов
/ 19 апреля 2011

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

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

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

1 голос
/ 19 апреля 2011

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

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

...