Node.js - Applicazione di ridimensionamento

Node.js viene eseguito in modalità single-thread, ma utilizza un paradigma basato sugli eventi per gestire la concorrenza. Facilita inoltre la creazione di processi figlio per sfruttare l'elaborazione parallela su sistemi basati su CPU multi-core.

I processi figlio hanno sempre tre flussi child.stdin, child.stdout, e child.stderr che può essere condiviso con i flussi stdio del processo genitore.

Node fornisce child_process modulo che ha i seguenti tre modi principali per creare un processo figlio.

  • exec - Il metodo child_process.exec esegue un comando in una shell / console e bufferizza l'output.

  • spawn - child_process.spawn avvia un nuovo processo con un dato comando.

  • fork - Il metodo child_process.fork è un caso speciale di spawn () per creare processi figli.

Il metodo exec ()

Il metodo child_process.exec esegue un comando in una shell e bufferizza l'output. Ha la seguente firma:

child_process.exec(command[, options], callback)

Parametri

Ecco la descrizione dei parametri utilizzati:

  • command (String) Il comando da eseguire, con argomenti separati da spazi

  • options (Oggetto) può comprendere una o più delle seguenti opzioni:

    • cwd (Stringa) Directory di lavoro corrente del processo figlio

    • env (Oggetto) Coppie chiave-valore dell'ambiente

    • encoding (Stringa) (predefinito: 'utf8')

    • shell (Stringa) Shell per eseguire il comando con (Default: '/ bin / sh' su UNIX, 'cmd.exe' su Windows, La shell dovrebbe comprendere l'opzione -c su UNIX o / s / c su Windows. Su Windows, l'analisi della riga di comando dovrebbe essere compatibile con cmd.exe.)

    • timeout (Numero) (impostazione predefinita: 0)

    • maxBuffer (Numero) (predefinito: 200 * 1024)

    • killSignal (Stringa) (impostazione predefinita: "SIGTERM")

    • uid (Numero) Imposta l'identità dell'utente del processo.

    • gid (Numero) Imposta l'identità di gruppo del processo.

  • callback La funzione ottiene tre argomenti error, stdout, e stderr che vengono chiamati con l'output quando il processo termina.

Il metodo exec () restituisce un buffer con una dimensione massima e attende che il processo termini e cerca di restituire tutti i dati memorizzati nel buffer contemporaneamente.

Esempio

Creiamo due file js denominati support.js e master.js -

File: support.js

console.log("Child Process " + process.argv[2] + " executed." );

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('Child process exited with exit code '+code);
   });
}

Ora esegui master.js per vedere il risultato -

$ node master.js

Verifica l'output. Il server è stato avviato.

Child process exited with exit code 0
stdout: Child Process 1 executed.

stderr:
Child process exited with exit code 0
stdout: Child Process 0 executed.

stderr:
Child process exited with exit code 0
stdout: Child Process 2 executed.

Il metodo spawn ()

Il metodo child_process.spawn avvia un nuovo processo con un dato comando. Ha la seguente firma:

child_process.spawn(command[, args][, options])

Parametri

Ecco la descrizione dei parametri utilizzati:

  • command (String) Il comando da eseguire

  • args (Array) Elenco di argomenti stringa

  • options (Oggetto) può comprendere una o più delle seguenti opzioni:

    • cwd (Stringa) Directory di lavoro corrente del processo figlio.

    • env (Oggetto) Coppie chiave-valore dell'ambiente.

    • stdio (Array) String Configurazione stdio del figlio.

    • customFds (Array) Descrittori di file deprecati per il bambino da utilizzare per stdio.

    • detached (Booleano) Il bambino sarà un leader del gruppo di processo.

    • uid (Numero) Imposta l'identità dell'utente del processo.

    • gid (Numero) Imposta l'identità di gruppo del processo.

Il metodo spawn () restituisce flussi (stdout e stderr) e dovrebbe essere utilizzato quando il processo restituisce una quantità di dati in volume. spawn () inizia a ricevere la risposta non appena il processo inizia l'esecuzione.

Esempio

Crea due file js denominati support.js e master.js -

File: support.js

console.log("Child Process " + process.argv[2] + " executed." );

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('child process exited with code ' + code);
   });
}

Ora esegui master.js per vedere il risultato -

$ node master.js

Verifica l'output. Il server è stato avviato

stdout: Child Process 0 executed.

child process exited with code 0
stdout: Child Process 1 executed.

stdout: Child Process 2 executed.

child process exited with code 0
child process exited with code 0

Il metodo fork ()

Il metodo child_process.fork è un caso speciale di spawn () per creare processi Node. Ha la seguente firma:

child_process.fork(modulePath[, args][, options])

Parametri

Ecco la descrizione dei parametri utilizzati:

  • modulePath (String) Il modulo da eseguire nel figlio.

  • args (Array) Elenco di argomenti stringa

  • options (Oggetto) può comprendere una o più delle seguenti opzioni:

    • cwd (Stringa) Directory di lavoro corrente del processo figlio.

    • env (Oggetto) Coppie chiave-valore dell'ambiente.

    • execPath (String) Eseguibile utilizzato per creare il processo figlio.

    • execArgv (Array) Elenco di argomenti stringa passati all'eseguibile (impostazione predefinita: process.execArgv).

    • silent (Boolean) Se true, stdin, stdout e stderr del figlio verranno reindirizzati al genitore, altrimenti verranno ereditati dal genitore, vedere le opzioni "pipe" e "inherit" per lo stdio di spawn () per ulteriori informazioni dettagli (l'impostazione predefinita è false).

    • uid (Numero) Imposta l'identità dell'utente del processo.

    • gid (Numero) Imposta l'identità di gruppo del processo.

Il metodo fork restituisce un oggetto con un canale di comunicazione integrato oltre ad avere tutti i metodi in una normale istanza ChildProcess.

Esempio

Crea due file js denominati support.js e master.js -

File: support.js

console.log("Child Process " + process.argv[2] + " executed." );

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('child process exited with code ' + code);
   });
}

Ora esegui master.js per vedere il risultato -

$ node master.js

Verifica l'output. Il server è stato avviato.

Child Process 0 executed.
Child Process 1 executed.
Child Process 2 executed.
child process exited with code 0
child process exited with code 0
child process exited with code 0