Способы реализации задач, связанных с процессором, в nodejs

Я использую nodejs для веб-сервера, который декодирует параметры GET и возвращает данные в некотором закодированном формате. Декодирование / кодирование выполняется с использованием криптографического модуля nodejs, который кажется синхронным. Хотя время, необходимое для обслуживания одного запроса, достаточно велико, из-за блокировки цикла событий служба плохо работает с параллелизмом.

Мое требование простое: сделайте функциональность кодирования / декодирования вне цикла событий.

  1. Отдельный процесс (дочерний_процесс или кластер)

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

  1. Отдельный поток для каждого запроса (thread-a-gogo или fiber или node-webworker)

Создайте отдельный поток для каждого запроса для выполнения операции кодирования / декодирования, но ни один из модулей, похоже, не работает должным образом, то есть thread-a-gogo не устанавливается через npm, fiber не создавал отдельный поток при запуске (), не работает.

Сталкивался ли кто-нибудь с подобной проблемой или есть ли способ легко создавать потоки в nodejs с простой передачей сообщений.


person mdprasadeng    schedule 30.05.2012    source источник
comment
Ответ в # 1: вам нужно превратить ваше блокирование / активное ожидание в стиль, управляемый пассивными событиями.   -  person ControlAltDel    schedule 30.05.2012
comment
Я думаю, что задачи, связанные с процессором, и узел не подходят. Тогда вам лучше использовать Java, например, и позволить node / java эффективно взаимодействовать друг с другом.   -  person Alfred    schedule 30.05.2012
comment
Я понимаю, что задачи, связанные с процессором в nodejs, ужасны, поэтому ожидал, что встроенный модуль шифрования будет обрабатывать это отдельно. Но разве нет другого выхода, кроме ретрансляции на Java / C?   -  person mdprasadeng    schedule 31.05.2012


Ответы (1)


Это встроено в дочерние процессы узла. Документы здесь:

http://nodejs.org/api/child_process.html#child_process_child_send_message_sendhandle

Вы также можете использовать кластер:

http://nodejs.org/api/cluster.html#cluster_cluster_fork_env

С кластером это будет работать примерно так:

if (cluster.isMaster) {
  var worker = cluster.fork();
  worker.send('encodeThisString');

} else if (cluster.isWorker) {
  process.on('message', function(msg) {
    var encrypted = crypto.doSomeEncryption(msg);
    process.send(encrypted);
  });
}
person hunterloftis    schedule 10.03.2013