Длительные вычисления в node.js

Я пишу игровой сервер в node.js, а некоторые операции связаны с большими вычислениями на части сервера. Я не хочу прекращать прием соединений во время выполнения этих вычислений - как я могу запустить их в фоновом режиме, когда node.js не поддерживает потоки?

Ответы

Ответ 1

Я не могу ручаться за любой из них, лично, но если вы преуспели в выполнении незавершенного процесса, существует пара независимых реализаций API WebWorkers для node, как указано на странице модулей node:

  • http://github.com/cramforce/ node -worker
  • http://github.com/pgriess/ node -webworker

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

Кроме того, для того, что стоит, команда node.js намеревается реализовать именно этот API изначально, в конце концов, поэтому эти инструменты, даже если они не идеальны, могут быть приличной остановкой.

Ответ 2

var spawn = require('child_process').spawn;
listorwhatev = spawn('ls', ['-lh', '/usr']);//or whatever server action you need

//then you can attach events to that list like this
listorwhatev.on('exit', function(code){});

///or in this ls example as it streams info
listorwhatev.stdout.on('data', function(info){sys.puts(info);});

гарантировать, что процесс появления происходит один раз для каждого приложения, а затем загружает в него материал и отслеживает события для каждого соединения. вы также должны проверить, что listorwhatev все еще работает, прежде чем обращаться с ним. Поскольку все мы любим эти нечеткие ошибки в node сбой приложения, не так;) Когда spawn (pid) выйдет из-за того, что на вашем компьютере произошло убийство или что-то плохое, и вы не выходите из икры в своем коде изящно, ваш обработчик событий потока отключит ваше приложение.

Ответ 3

а некоторые операции связаны с тяжелыми вычисление на части сервера

Как вы пишете код, который в основном вычисляется. Это очень сложно сделать в node.js.

как я могу запустить их в фоновом режиме когда node.js не поддерживает потоки

вы можете создать несколько рабочих (node) экземпляров и обмениваться данными с принимающими соединениями (node instance), используя, например, redis blocking pop. node.js библиотека redis не блокирует.