Node.js multiproceso
Todos sabemos que Node.js es el modo de un solo subproceso, pero se usa para manejar concurrente orientada a eventos, lo que nos ayudará a crear múltiples subprocesos en el sistema de la CPU multi-core, lo que mejora el rendimiento.
Cada niño es siempre con tres objetos de flujo: child.stdin, child.stdout y child.stderr. Pueden compartir el proceso primario corriente stdio, o también se puede dirigir objeto de flujo independiente.
Nodo proporciona módulos child_process para crear un proceso hijo, por:
exec - child_process.exec proceso hijo utilización Ejecutar, el búfer de salida proceso hijo, y la salida del proceso hijo se devuelve en forma de una función de devolución de parámetros.
desovar - child_process.spawn utilizando los parámetros de línea de comandos especificados para crear un nuevo proceso.
tenedor - child_process.fork se desovar () forma especial para el módulo que se ejecuta en el niño, como tenedor ( './ son.js') corresponde a desovar ( "nodo", [ ' ./son.js' ]).La diferencia es el método de desove, tenedor en el proceso entre padres e hijos, a establecer un conducto de comunicación para la comunicación entre procesos.
método exec ()
Ejecutar proceso hijo utilización child_process.exec, el búfer de salida proceso hijo, y la salida del proceso hijo se devuelve en forma de una función de devolución de parámetros.
La sintaxis es la siguiente:
child_process.exec(command[, options], callback)
parámetros
Los parámetros son como sigue:
command: String, el comando a ejecutar, los parámetros separados por espacios
Opciones: Los objetos pueden ser:
- La corriente de trabajo actual directorio de trabajo, secuencia, el proceso hijo
- env, el objeto de las variables ambientales clave
- codificación, la secuencia, la codificación de caracteres (por defecto: 'UTF-8')
- cáscara, cuerda, para ejecutar el comando Shell (por defecto: en UNIX es
/bin/sh
, como en Windowscmd.exe
, Shell debe ser capaz de identificar el-c
interruptor en UNIX o/s /c
de Windows. en Windows, la línea de comandos de análisis de la compatibilidad decmd.exe
) - tiempo de espera, digital, tiempo de espera (por defecto: 0)
- maxBuffer, digital, la memoria intermedia máxima en stdout o stderr se permite la existencia (binario), por lo que si el niño va a ser matado allá (por defecto: 200 * 1024)
- killSignal, señal de fin de cadena (por defecto: 'SIGTERM')
- UID, digitales, establezca el ID de usuario del proceso
- gid,, establezca grupo de proceso digital de Identificación
devolución de llamada: llamada de retorno tiene tres argumentos de error, stdout y stderr.
exec () devuelve el máximo del búfer, y esperar el final del proceso, una sola vez devolver el contenido de la memoria intermedia.
Ejemplos
Vamos a crear dos archivos js support.js y master.js.
código del archivo support.js:
console.log("进程 " + process.argv[2] + " 执行。" );
código del archivo master.js:
const fs = require('fs'); const child_process = require('child_process'); for(var i=0; i<3; i++) { var workerProcess = child_process.exec('node support.js '+i, function (error, stdout, stderr) { if (error) { console.log(error.stack); console.log('Error code: '+error.code); console.log('Signal received: '+error.signal); } console.log('stdout: ' + stdout); console.log('stderr: ' + stderr); }); workerProcess.on('exit', function (code) { console.log('子进程已退出,退出码 '+code); }); }
Aplicación del código anterior, la salida es:
$ node master.js 子进程已退出,退出码 0 stdout: 进程 1 执行。 stderr: 子进程已退出,退出码 0 stdout: 进程 0 执行。 stderr: 子进程已退出,退出码 0 stdout: 进程 2 执行。 stderr:
desove método ()
child_process.spawn utilizando los parámetros de línea de comandos especificados para crear un nuevo proceso, la sintaxis es la siguiente:
child_process.spawn(command[, args][, options])
parámetros
Los parámetros son como sigue:
comando: el comando para ejecutar
args: array parámetro de cadena de matriz
opciones de objetos
- directorio de trabajo actual Cwd cadena del proceso hijo
- Objeto de entorno env pares de clave y valor variable
- Matriz stdio | subproceso stdio Configuración de la secuencia
- Boole individual Este niño llegará a ser un líder de grupo de procesos
- Número de fluido para establecer el ID de usuario del proceso
- gid grupo de procesos número de ID
método de freza () devuelve la corriente (stdout y stderr), que se utiliza en el proceso para devolver grandes cantidades de datos. Una vez que el proceso se inició cuando el desove () comenzó a recibir una respuesta.
Ejemplos
Vamos a crear dos archivos js support.js y master.js.
código del archivo support.js:
console.log("进程 " + process.argv[2] + " 执行。" );
código del archivo master.js:
const fs = require('fs'); const child_process = require('child_process'); for(var i=0; i<3; i++) { var workerProcess = child_process.spawn('node', ['support.js', i]); workerProcess.stdout.on('data', function (data) { console.log('stdout: ' + data); }); workerProcess.stderr.on('data', function (data) { console.log('stderr: ' + data); }); workerProcess.on('close', function (code) { console.log('子进程已退出,退出码 '+code); }); }
Aplicación del código anterior, la salida es:
$ node master.js stdout: 进程 0 执行。 子进程已退出,退出码 0 stdout: 进程 1 执行。 子进程已退出,退出码 0 stdout: 进程 2 执行。 子进程已退出,退出码 0
método tenedor
child_process.fork es una forma especial de método para crear procesos de desove (), la sintaxis es la siguiente:
child_process.fork(modulePath[, args][, options])
parámetros
Los parámetros son como sigue:
ModulePath: Cadena, que se ejecutará en un módulo de proceso hijo
args: array parámetro de cadena de matriz
Opciones: Objeto
- directorio de trabajo actual Cwd cadena del proceso hijo
- Objeto de entorno env pares de clave y valor variable
- execPath Cadena crear un proceso hijo del archivo ejecutable
- archivo ejecutable (por defecto: process.execArgv) matriz de parámetros cadena execArgv matriz del niño
- Si booleana en silencio
true
, del niñostdin
,stdout
ystderr
se vinculará al proceso padre, de lo contrario, serán heredados del proceso padre. (Por defecto:false
) - Número de fluido para establecer el ID de usuario del proceso
- gid grupo de procesos número de ID
El objeto devuelto, además de todos los métodos tienen ChildProcess ejemplo, hay un canal de comunicación integrado.
h3> EjemplosVamos a crear dos archivos js support.js y master.js.
código del archivo support.js:
console.log("进程 " + process.argv[2] + " 执行。" );
código del archivo master.js:
const fs = require('fs'); const child_process = require('child_process'); for(var i=0; i<3; i++) { var worker_process = child_process.fork("support.js", [i]); worker_process.on('close', function (code) { console.log('子进程已退出,退出码 ' + code); }); }
Aplicación del código anterior, la salida es:
$ node master.js 进程 0 执行。 子进程已退出,退出码 0 进程 1 执行。 子进程已退出,退出码 0 进程 2 执行。 子进程已退出,退出码 0