Latest web development tutorials

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 Windows cmd.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 compatibile cmd.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 bambino stdin , stdout e stderr 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> 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 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