English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Todos sabemos que Node.js se ejecuta en modo de un solo hilo, pero utiliza un mecanismo de eventos para manejar la concurrencia, lo que nos ayuda a crear múltiples procesos secundarios en sistemas con cpu de múltiples núcleos, mejorando así el rendimiento.
Cada proceso secundario siempre tiene tres objetos de flujo: child.stdin, child.stdout y child.stderr. Pueden compartir los flujos stdio del proceso padre, o también pueden ser objetos de flujo independientes que se derivan.
Node proporciona el módulo child_process para crear procesos secundarios, y los métodos disponibles son:
exec - child_process.exec ejecuta un comando usando un subproceso, almacena la salida del subproceso y devuelve la salida del subproceso en la forma de parámetros de la función de devolución de llamada.
spawn - child_process.spawn crea un nuevo proceso utilizando los parámetros de línea de comandos especificados.
fork}} - child_process.fork es una forma especial de spawn() utilizada para ejecutar módulos en subprocesos, como fork('.',/son.js')) equivalente a spawn('node', ['.',/son.js'))). Diferente al método spawn, fork crea un canal de comunicación entre el proceso padre y el hijo, utilizado para la comunicación entre procesos.
child_process.exec ejecuta un comando usando un subproceso, almacena la salida del subproceso y devuelve la salida del subproceso en la forma de parámetros de la función de devolución de llamada.
La sintaxis es como se muestra a continuación:
child_process.exec(command[, opciones], callback)
Descripción de los parámetros como se muestra a continuación:
command: cadena, comando que se ejecutará, los parámetros se separan por espacios
opciones : objeto, puede ser:
cwd, cadena, directorio de trabajo del subproceso
env, objeto de variables de entorno clave-valor
encoding, cadena, codificación de caracteres (por defecto: 'utf8'])
shell, cadena, Shell que se ejecutará el comando (por defecto: en UNIX es/bin/sh, en Windows es cmd.exe, el Shell debe poder reconocer -la opción c en UNIX, o /s /c en Windows. En Windows, el análisis de la línea de comandos debe ser compatible con cmd.exe)
timeout, número, tiempo de espera (por defecto: 0)
maxBuffer, número, el buffer máximo permitido en stdout o stderr (binario), si se supera, el subproceso será matado (por defecto: 200*1024)
killSignal, cadena, señal de finalización (por defecto: 'SIGTERM')
uid, número, establece el ID del proceso del usuario
gid, número, establece el ID del grupo de procesos
callback :La función de devolución de llamada, contiene tres parámetros error, stdout y stderr.
El método exec() devuelve el buffer más grande, espera que el proceso termine y devuelve el contenido del buffer de una vez.
Vamos a crear dos archivos js, support.js y master.js.
console.log("Proceso ") + process.argv[2] + "Ejecutar." );
const fs = require('fs'); const child_process = require('child_process'); for(var i=0; i<3; i++) { var procesoWorker = child_process.exec('node support.js ')+i, función, (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('El subproceso ha salido, código de salida ')+code); }); }
Ejecutar el código siguiente, el resultado de salida es:
$ node master.js El subproceso ha salido, código de salida 0 stdout: proceso 1 Ejecutar. stderr: El subproceso ha salido, código de salida 0 stdout: proceso 0 ejecutándose. stderr: El subproceso ha salido, código de salida 0 stdout: proceso 2 Ejecutar. stderr:
child_process.spawn crea un nuevo proceso con los argumentos de línea de comandos especificados, con el siguiente formato de sintaxis:
child_process.spawn(command[, args][, options])
Descripción de los parámetros como se muestra a continuación:
command: comando a ejecutar
args: Array array de parámetros de cadena
options Object
cwd String el directorio de trabajo del subproceso
env Objeto el par de valores clave de las variables de entorno
stdio Array|String configuración de stdio del subproceso
detached Boolean el subproceso se convertirá en el líder del grupo de procesos
uid Número configurar el ID del proceso de usuario
gid Número configurar el ID del grupo de procesos
El método spawn() devuelve flujos (stdout & stderr), utilizados cuando el proceso devuelve una gran cantidad de datos. spawn() comienza a recibir respuestas una vez que el proceso comienza a ejecutarse.
Vamos a crear dos archivos js, support.js y master.js.
console.log("Proceso ") + process.argv[2] + "Ejecutar." );
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('El subproceso ha salido, código de salida ')+code); });}
Ejecutar el código siguiente, el resultado de salida es:
$ node master.js stdout: proceso 0 ejecutándose. El subproceso ha salido, código de salida 0 stdout: proceso 1 Ejecutar. El subproceso ha salido, código de salida 0 stdout: proceso 2 Ejecutar. El subproceso ha salido, código de salida 0
child_process.fork es una forma especial de spawn(), utilizada para crear procesos, con el siguiente formato de sintaxis:
child_process.fork(modulePath[, args][, options])
Descripción de los parámetros como se muestra a continuación:
modulePath: String, el módulo que se ejecutará en el subproceso
args: Array el array de parámetros de cadena
options:Objeto
cwd String el directorio de trabajo del subproceso
env Objeto el par de valores clave de las variables de entorno
execPath String el archivo ejecutable para crear el subproceso
execArgv Array el array de parámetros de cadena del archivo ejecutable del subproceso (Predeterminado: process.execArgv)
silent Boolean si es verdadero, el stdin, stdout y stderr del subproceso se asociarán con el proceso padre, de lo contrario, heredarán de él del proceso padre. (Predeterminado: false)
uid Número configurar el ID del proceso de usuario
gid Número configurar el ID del grupo de procesos
El objeto devuelto además de poseer todos los métodos del ejemplo ChildProcess, tiene un canal de comunicación integrado.
Vamos a crear dos archivos js, support.js y master.js.
console.log("Proceso ") + process.argv[2] + "Ejecutar." );
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('El subproceso ha salido, código de salida ') + code); });}
Ejecutar el código siguiente, el resultado de salida es:
$ node master.js Proceso 0 ejecutar. El subproceso ha salido, código de salida 0 Proceso 1 Ejecutar. El subproceso ha salido, código de salida 0 Proceso 2 Ejecutar. El subproceso ha salido, código de salida 0