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