Узел имеет несколько потоков, но JavaScript, работающий на V8, является однопоточным. Модуль Node Child_process используется для создания детских процессов, и мы можем полностью использовать процессор через детские процессы. пример:
Кода -копия выглядит следующим образом:
var fork = require ('child_process'). fork;
// Получить номер процессора текущей машины
var cpus = require ('os'). cpus ();
for (var i = 0; i <cpus.length; i ++) {
// генерировать новый процесс
fork ('./ Worker.js');
}
Вот несколько способов создания процессов, включая вилку:
1.spawn (command, [args], [options]), запустите новый процесс для выполнения команды команды, Args - это параметр командной строки
2.Exec (Command, [Options], Callback), запустите новый процесс для выполнения команды команды, обратный вызов используется для получения стандартного ввода, стандартного вывода и информации об ошибках в конце процесса.
3.Execfile (file, [args], [options], [callback]), запускает новый процесс для выполнения исполняемого файла. Обратный вызов используется для получения стандартного ввода, стандартного вывода и информации об ошибках в конце процесса.
4.Fork (ModulePath, [args], [Options]), запустите новый процесс для выполнения модуля файла JavaScript, и в настоящее время создается процесс Node Child.
Узел межпроцессной связи
Родительский процесс
Кода -копия выглядит следующим образом:
// parent.js
var fork = require ('child_process'). fork;
// вилка возвращает детский процесс объект n
var n = fork ('./ child.js');
// обрабатывать сообщение события
n.on ('message', function (m) {
// Получить сообщение, отправленное детьми
console.log ('Получил сообщение:' + m);
});
// Отправить сообщение в процесс ребенка
N.send ({hello: 'world'});
Подпроцесс
Кода -копия выглядит следующим образом:
// Child.js
// обрабатывать сообщение события
process.on ('message', function (m) {
console.log ('Получил сообщение:' + m);
});
// Метод отправки существует для отправки сообщений в родительский процесс.
process.send ({foo: 'bar'});
Следует отметить, что метод отправки здесь синхронно, поэтому не рекомендуется отправлять большие объемы данных (вместо этого вы можете использовать трубу, см. Http://nodejs.org/api/all.html#child_process_child_process_spawn_command_args_options для получения подробной информации).
В особых случаях значение атрибута CMD в сообщении содержит префикс NODE_ (например: {cmd: 'node_foo'}), тогда это сообщение не будет отправлено на событие сообщения (но событие InternalMessage), и они используются внутри узла.
Прототип метода отправки:
Кода -копия выглядит следующим образом:
Отправить (сообщение, [Sendhandle])
Здесь Sendhandle (ручка) можно использовать для отправки:
1.net.native, нативный гнездо C ++ TCP или трубопровод
2.net.server, TCP -сервер
3.NET.Socket, TCP -розетка
4.dgram.native, нативная сокет C ++ UDP
5.dgram.socket, UDP -розетка
Отправьте при отправке SendHandle, не может (и не может) непосредственно отправлять объекты JavaScript, а отправить дескриптор файла (в конечном итоге отправлено в виде строки JSON). Другие процессы могут восстановить соответствующий объект через этот дескриптор файла.
Теперь посмотрите на пример:
Родительский процесс
Кода -копия выглядит следующим образом:
// parent.js
var fork = require ('child_process'). fork;
var n = fork ('./ child.js');
var server = require ('net'). createServer ();
server.listen (7000, function () {
// Отправить TCP -сервер на дочерний процесс
N.Send ('Server', Server);
}). on ('connection', function () {
console.log ('connection - parent');
});
Подпроцесс
Кода -копия выглядит следующим образом:
process.on ('message', function (m, h) {
if (m === 'server') {
h.on ('connection', function () {
console.log ('connection - ребенок');
});
}
});
Доступ к этой программе через порт 7000 может привести к тому, что вывод как родитель или подключение к ребенку. Здесь дочерний процесс и родительский процесс прослушивают порт 7000 одновременно. Вообще говоря, несколько процессов, слушающих один и тот же порт, вызовут исключение Eaddrinuse. В этом случае в двух разных процессах используется один и тот же дескриптор файла, а узел, лежащий в основе уровня, устанавливает опцию SO_Reuseaddr в сокете при прослушивании порта, который позволяет повторно использовать этот сокет между различными процессами. Когда несколько процессов прослушивают один и тот же порт, дескриптор файла может использоваться только одним процессом одновременно, и эти процессы используют сокеты превентивно.
кластерный модуль
Новый кластер был добавлен в V0.8 в узле, через который модуль кластера может легко создать группу процессов, слушающих тот же порт на физической машине. пример:
Кода -копия выглядит следующим образом:
var cluster = require ('cluster');
var http = require ('http');
var numcpus = require ('os'). cpus (). Length;
// Проверьте, является ли процесс основным процессом
if (cluster.ismaster) {
для (var i = 0; i <numcpus; ++ i)
// генерировать новый работник (можно назвать только основной процесс)
cluster.fork ();
cluster.on ('exit', function (рабочий, код, сигнал) {
console.log («Работник» + работник.process.pid + 'die');
});
} еще {
http.createserver (function (req, res) {
res.writehead (200);
res.end ('Hello World/N');
}). Слушай (8000);
}
Мы называем метод прослушивания в рабочем процессе, и запрос на прослушивание будет передаваться в мастер -процесс. Если у мастер -процесса уже есть сервер, слушающий, чтобы соответствовать требованиям рабочего процесса, дескриптор этого сервера будет передана работнику. Если его не существует, мастер -процесс создаст один, а затем передаст ручку работнику.
Более подробная документация о кластере: http://www.nodejs.org/api/cluster.html