Долгосрочные вычисления в node.js - PullRequest
14 голосов
/ 28 сентября 2010

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

Ответы [ 3 ]

13 голосов
/ 02 октября 2010

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

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

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

4 голосов
/ 07 октября 2010
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 все еще работает, прежде чем обрабатывать его. Поскольку мы все любим эти необъяснимые ошибки при сбое узла, не правда ли;) Когда spawn (pid) завершается, хотя на вашей машине происходит уничтожение или что-то плохое, и вы не корректно завершили spawn в своем коде, ваш обработчик потоковых событий приведет к сбою приложения.

1 голос
/ 28 сентября 2010

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

Как вы написали код, который в первую очередь требует больших вычислительных ресурсов? Это очень сложно сделать в node.js.

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

вы можете создать пару рабочих (узлов) экземпляров и обмениваться данными с принимающими соединениями (экземплярами узлов), используя, например, блокировку всплывающих окон. Библиотека Redis Node.js не блокируется.

...