2013-03-24 4 views
1

я должен служить расчет с помощью алгоритма, я посоветовал использовать дочерний процесс на каждую открытой розетку, что я собираюсь сделать что-то вроде этого:Каков предел нереста child_processes?

var spawn = require('child_process').spawn; 
var child = spawn('node', ['algorithem.js']); 

Я знаю, как отправить аргумент к процессу алгоритма и как получать результаты.

Что меня беспокоит, сколько гнезд (каждый сокет будет порождать процесс) У меня может быть? Как я могу решить эту проблему с помощью моего провайдера облачных услуг? так что мое приложение автоматически масштабируется?

Какой рекомендуемый узел провайдера облачного хостинга?

И, наконец, это хороший подход к использованию дочерних процессов?

ответ

4

Да, это справедливый подход, когда вам нужно сделать тяжелую обработку в узле. Однако при запуске нового процесса возникают некоторые накладные расходы, поэтому имейте в виду. Количество сокетов (файловых дескрипторов), которые вы можете открыть, ограничено вашей операционной системой. В Linux ограничения можно увидеть, например, с помощью ulimit -utility.

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

+0

На самом деле, я использую сервер узла только для вычисления этого алгоритма, но что вы подразумеваете под «Этот сервер может порождать N рабочих потоков»? не каждый процесс порождения является потоком сам по себе? или мне нужно создавать потоки самим собой? можете ли вы написать простой пример, чтобы сделать его более понятным? спасибо – simo

+0

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

+0

Не могли бы вы объяснить, как уменьшить количество открытых сокетов? может ли один сокет обслуживать более одного соединения? – simo

Смежные вопросы