El nodo tiene múltiples hilos, pero JavaScript que se ejecuta en V8 es un solo roscado. El módulo Child_Process de Node se utiliza para crear procesos infantiles, y podemos hacer uso completo de la CPU a través de los procesos infantiles. ejemplo:
La copia del código es la siguiente:
var fork = request ('child_process'). bifor;
// Obtener el número de CPU de la máquina actual
var cpus = require ('OS'). CPUS ();
para (var i = 0; i <cpus.length; i ++) {
// Generar un nuevo proceso
horquilla ('./ trabajador.js');
}
Aquí hay algunas formas de crear procesos, incluido el bifurcado:
1.spawn (comando, [args], [opciones]), inicie un nuevo proceso para ejecutar el comando comando, args es un parámetro de línea de comando
2.exec (comando, [opciones], devolución de llamada), inicie un nuevo proceso para ejecutar el comando comando, la devolución de llamada se usa para obtener información estándar, salida estándar e información de error al final del proceso.
3.Execfile (archivo, [args], [opciones], [devolución de llamada]), inicia un nuevo proceso para ejecutar el archivo ejecutable. La devolución de llamada se utiliza para obtener información estándar de entrada, salida estándar y error al final del proceso.
4.Fork (módulo de módulo, [args], [opciones]), inicie un nuevo proceso para ejecutar un módulo de archivo JavaScript, y el proceso de nodo infantil se crea en este momento.
Comunicación de interprocesos de nodo
Proceso principal
La copia del código es la siguiente:
// parent.js
var fork = request ('child_process'). bifor;
// la bifurca devuelve objeto de proceso infantil n
var n = bifor ('./ child.js');
// manejar el mensaje del evento
n.on ('mensaje', función (m) {
// recibir un mensaje enviado por el proceso del niño
console.log ('Got Message:' + M);
});
// Enviar un mensaje al proceso del niño
n.send ({Hello: 'World'});
Subproceso
La copia del código es la siguiente:
// child.js
// manejar el mensaje del evento
Process.on ('Mensaje', function (M) {
console.log ('Got Message:' + M);
});
// El método de envío existe para enviar mensajes al proceso principal.
process.send ({foo: 'bar'});
Cabe señalar que el método de envío aquí es sincrónico, por lo que no se recomienda enviar grandes cantidades de datos (puede usar tubería en su lugar, consulte http://nodejs.org/api/all.html#child_process_child_process_spawn_command_args_options para obtener detalles).
En casos especiales, el valor del atributo CMD en el mensaje contiene el prefijo Node_ (por ejemplo: {cmd: 'node_foo'} mensaje), entonces este mensaje no se enviará al evento del mensaje (pero el evento interno de Message), y se usan internamente por node.
El prototipo del método de envío es:
La copia del código es la siguiente:
Enviar (mensaje, [sendHandle])
Aquí, SendHandle (Handle) se puede usar para enviar:
1.net.native, nativo de C ++ C ++ TCP o tubería
2.net.server, servidor TCP
3.net.socket, TCP Socket
4.dgram.native, nativo de C ++ UDP Socket
5.dgram.socket, udp socket
Enviar cuando envía SendHandle, no es (y no) enviar directamente los objetos JavaScript, sino enviar un descriptor de archivo (eventualmente enviado como una cadena JSON). Otros procesos pueden restaurar el objeto correspondiente a través de este descriptor de archivo.
Ahora mira un ejemplo:
Proceso principal
La copia del código es la siguiente:
// parent.js
var fork = request ('child_process'). bifor;
var n = bifor ('./ child.js');
var ser servidor = request ('net'). CreateServer ();
servidor.listen (7000, function () {
// Enviar el servidor TCP al proceso infantil
n.send ('servidor', servidor);
}). on ('conexión', function () {
console.log ('conexión - parent');
});
Subproceso
La copia del código es la siguiente:
Process.on ('Mensaje', Función (M, H) {
if (m === 'servidor') {
h.on ('conexión', function () {
console.log ('conexión - niño');
});
}
});
Acceder a este programa a través del puerto 7000 puede dar lugar a la salida como el padre de conexión o el niño de conexión. Aquí, el proceso infantil y el proceso principal escuchan el puerto 7000 al mismo tiempo. En términos generales, múltiples procesos que escuchan el mismo puerto causarán una excepción eaddrinuse. En este caso, dos procesos diferentes usan el mismo descriptor de archivo, y la capa subyacente del nodo establece la opción SO_REUSeadDR en el socket cuando escucha el puerto, lo que permite que este socket se reutilice entre los diferentes procesos. Cuando múltiples procesos escuchan el mismo puerto, el descriptor del archivo solo puede ser utilizado por un proceso al mismo tiempo, y estos procesos usan enchufes preventivamente.
módulo de clúster
Se ha agregado un nuevo módulo de clúster a V0.8 en el nodo, a través del cual el módulo de clúster puede construir fácilmente un grupo de procesos que escuchan el mismo puerto en una máquina física. ejemplo:
La copia del código es la siguiente:
var cluster = request ('cluster');
var http = require ('http');
var numCpus = request ('OS'). CPUS (). Longitud;
// verifique si el proceso es un proceso maestro
if (cluster.ismaster) {
para (var i = 0; i <numCpus; ++ i)
// Generar un nuevo proceso de trabajo (solo se puede llamar al proceso maestro)
cluster.fork ();
cluster.on ('exit', function (trabajador, código, señal) {
console.log ('trabajador' + trabajador.process.pid + 'die');
});
} demás {
http.createServer (function (req, res) {
Res.Writehead (200);
res.end ('Hello World/n');
}). Escuchar (8000);
}
Llamamos al método de escucha en el proceso de trabajo, y la solicitud de escucha se pasará al proceso maestro. Si el proceso maestro ya tiene un servidor que escucha para cumplir con los requisitos del proceso del trabajador, el mango de este servidor se pasará al trabajador. Si no existe, el proceso maestro creará uno y luego pasará el mango al proceso del trabajador.
Documentación más detallada sobre Cluster: http://www.nodejs.org/api/cluster.html