Длительные вычисления в 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 не блокирует.