Node.js multi-processo
Sappiamo tutti che Node.js è la modalità single-threaded, ma viene utilizzato per gestire concomitante event-driven, che ci aiuterà a creare più sotto-processi sul sistema CPU multi-core, che migliora le prestazioni.
Ogni bambino è sempre con tre oggetti di flusso: child.stdin, child.stdout e child.stderr. Essi possono condividere il processo padre flusso stdio, o può anche essere guidato oggetto flusso indipendente.
Nodo fornisce moduli child_process per creare un processo figlio, da:
exec - child_process.exec processo figlio uso Run, il buffer di output processo figlio, e l'uscita del processo figlio viene restituito sotto forma di un parametri di funzione di callback.
deporre le uova - child_process.spawn utilizzando i parametri della riga di comando specificati per creare un nuovo processo.
fork - child_process.fork si depongono le uova () forma speciale per il modulo in esecuzione nel bambino, come fork ( './ son.js') corrisponde a deporre le uova ( 'nodo', [ ' ./son.js' ]).La differenza è il metodo uova, forchetta tra il processo padre e figlio, stabilire un canale di comunicazione per la comunicazione tra processi.
il metodo exec ()
child_process.exec processo figlio uso Run, il buffer di output processo figlio, e l'uscita del processo figlio viene restituito sotto forma di un parametri di funzione di callback.
La sintassi è la seguente:
child_process.exec(command[, options], callback)
parametri
I parametri sono i seguenti:
command: String, il comando da eseguire, i parametri separati da spazi
Opzioni: oggetti possono essere:
- La directory di lavoro corrente cwd, stringa, il processo figlio
- env, l'oggetto delle variabili ambientali
- codifica, string, codifica dei caratteri (default: 'utf8')
- conchiglia, archi, per eseguire il comando di Shell (default: su UNIX è
/bin/sh
, come in Windowscmd.exe
, Shell dovrebbe essere in grado di identificare il-c
interruttore in UNIX, o/s /c
in Windows. in Windows, la riga di comando parsing compatibilecmd.exe
) - timeout, digitale, timeout (default: 0)
- maxBuffer, digitale, il buffer di massima in stdout o stderr è permesso di esistere (binario), quindi se il bambino sarà ucciso oltre (default: 200 * 1024)
- killSignal, segnale di fine stringa (default: 'SIGTERM')
- uid, digitale, impostare l'ID utente del processo
- gid, digitale, impostare gruppo processo ID
callback: funzione di callback ha tre argomenti errore, stdout e stderr.
exec () restituisce il buffer massima, e attendere la fine del processo, una sola volta restituire il contenuto del buffer.
Esempi
Creiamo due file JS support.js e master.js.
codice del file support.js:
console.log("进程 " + process.argv[2] + " 执行。" );
codice del file 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); }); }
L'attuazione del codice di cui sopra, l'output è:
$ node master.js 子进程已退出,退出码 0 stdout: 进程 1 执行。 stderr: 子进程已退出,退出码 0 stdout: 进程 0 执行。 stderr: 子进程已退出,退出码 0 stdout: 进程 2 执行。 stderr:
Metodo di spawn ()
child_process.spawn utilizzando i parametri della riga di comando specificati per creare un nuovo processo, la sintassi è la seguente:
child_process.spawn(command[, args][, options])
parametri
I parametri sono i seguenti:
comando: il comando da eseguire
args: matrice di parametri di stringa Array
opzioni oggetto
- Cwd stringa di directory di lavoro corrente del processo figlio
- ambiente Object ENV coppie chiave-valore variabile
- Array stdio | sottoprocesso configurazione stdio String
- Booleano indipendente Questo bambino diventerà un leader del gruppo processo
- Numero UID per impostare l'ID utente del processo
- gid gruppo processo numero ID
Metodo spawn () restituisce lo stream (stdout e stderr), utilizzato nel processo di restituire grandi quantità di dati. Una volta che il processo avviato quando il micelio () ha iniziato a ricevere una risposta.
Esempi
Creiamo due file JS support.js e master.js.
codice del file support.js:
console.log("进程 " + process.argv[2] + " 执行。" );
codice del file 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); }); }
L'attuazione del codice di cui sopra, l'output è:
$ node master.js stdout: 进程 0 执行。 子进程已退出,退出码 0 stdout: 进程 1 执行。 子进程已退出,退出码 0 stdout: 进程 2 执行。 子进程已退出,退出码 0
metodo forchetta
child_process.fork è una speciale forma di micelio () metodo per creare processi, sintassi è la seguente:
child_process.fork(modulePath[, args][, options])
parametri
I parametri sono i seguenti:
ModulePath: String, da eseguire in un modulo processo figlio
args: matrice di parametri di stringa Array
Opzioni: Object
- Cwd stringa di directory di lavoro corrente del processo figlio
- ambiente Object ENV coppie chiave-valore variabile
- execPath String creare un processo figlio del file eseguibile
- file eseguibile del parametro String serie execArgv bambino Array (default: process.execArgv)
- Se booleano silenzioso
true
, del bambinostdin
,stdout
estderr
sarà collegata al processo padre, in caso contrario, saranno ereditati dal processo genitore. (Default:false
) - Numero UID per impostare l'ID utente del processo
- gid gruppo processo numero ID
L'oggetto restituito in aggiunta a tutti i metodi hanno esempio processo figlio, vi è un canale di comunicazione integrato.
h3> EsempiCreiamo due file JS support.js e master.js.
codice del file support.js:
console.log("进程 " + process.argv[2] + " 执行。" );
codice del file 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); }); }
L'attuazione del codice di cui sopra, l'output è:
$ node master.js 进程 0 执行。 子进程已退出,退出码 0 进程 1 执行。 子进程已退出,退出码 0 进程 2 执行。 子进程已退出,退出码 0