Node.js - Application de mise à l'échelle

Node.js s'exécute dans un mode à un seul thread, mais il utilise un paradigme événementiel pour gérer la concurrence. Il facilite également la création de processus enfants pour tirer parti du traitement parallèle sur des systèmes basés sur des processeurs multicœurs.

Les processus enfants ont toujours trois flux child.stdin, child.stdout, et child.stderr qui peuvent être partagés avec les flux stdio du processus parent.

Node fournit child_process module qui propose les trois méthodes principales suivantes pour créer un processus enfant.

  • exec - La méthode child_process.exec exécute une commande dans un shell / console et met en mémoire tampon la sortie.

  • spawn - child_process.spawn lance un nouveau processus avec une commande donnée.

  • fork - La méthode child_process.fork est un cas particulier de spawn () pour créer des processus enfants.

La méthode exec ()

La méthode child_process.exec exécute une commande dans un shell et met en mémoire tampon la sortie. Il a la signature suivante -

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

Paramètres

Voici la description des paramètres utilisés -

  • command (Chaîne) La commande à exécuter, avec des arguments séparés par des espaces

  • options (Objet) peut comprendre une ou plusieurs des options suivantes -

    • cwd (String) Répertoire de travail actuel du processus enfant

    • env (Object) Paires clé-valeur d'environnement

    • encoding (Chaîne) (Par défaut: 'utf8')

    • shell (Chaîne) Shell pour exécuter la commande avec (Par défaut: '/ bin / sh' sous UNIX, 'cmd.exe' sous Windows, le shell doit comprendre le commutateur -c sous UNIX ou / s / c sous Windows. Sous Windows, L'analyse de la ligne de commande doit être compatible avec cmd.exe.)

    • timeout (Numéro) (Par défaut: 0)

    • maxBuffer (Numéro) (Par défaut: 200 * 1024)

    • killSignal (Chaîne) (Par défaut: 'SIGTERM')

    • uid (Number) Définit l'identité de l'utilisateur du processus.

    • gid (Number) Définit l'identité de groupe du processus.

  • callback La fonction obtient trois arguments error, stdout, et stderr qui sont appelés avec la sortie lorsque le processus se termine.

La méthode exec () renvoie un tampon avec une taille maximale et attend la fin du processus et essaie de renvoyer toutes les données mises en mémoire tampon à la fois.

Exemple

Créons deux fichiers js nommés support.js et 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);
   });
}

Maintenant, exécutez le master.js pour voir le résultat -

$ node master.js

Vérifiez la sortie. Le serveur a démarré.

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.

La méthode spawn ()

La méthode child_process.spawn lance un nouveau processus avec une commande donnée. Il a la signature suivante -

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

Paramètres

Voici la description des paramètres utilisés -

  • command (String) La commande à exécuter

  • args (Array) Liste des arguments de chaîne

  • options (Objet) peut comprendre une ou plusieurs des options suivantes -

    • cwd (Chaîne) Répertoire de travail actuel du processus enfant.

    • env (Object) Paires clé-valeur d'environnement.

    • stdio (Array) String Configuration stdio de l'enfant.

    • customFds (Array) Descripteurs de fichiers obsolètes que l'enfant doit utiliser pour stdio.

    • detached (Booléen) L'enfant sera un chef de groupe de processus.

    • uid (Number) Définit l'identité de l'utilisateur du processus.

    • gid (Number) Définit l'identité de groupe du processus.

La méthode spawn () renvoie des flux (stdout et stderr) et elle doit être utilisée lorsque le processus renvoie une quantité volumique de données. spawn () commence à recevoir la réponse dès que le processus commence à s'exécuter.

Exemple

Créez deux fichiers js nommés support.js et 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);
   });
}

Maintenant, exécutez le master.js pour voir le résultat -

$ node master.js

Vérifiez la sortie. Le serveur a démarré

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

La méthode fork ()

La méthode child_process.fork est un cas particulier de spawn () pour créer des processus Node. Il a la signature suivante -

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

Paramètres

Voici la description des paramètres utilisés -

  • modulePath (String) Le module à exécuter dans l'enfant.

  • args (Array) Liste des arguments de chaîne

  • options (Objet) peut comprendre une ou plusieurs des options suivantes -

    • cwd (Chaîne) Répertoire de travail actuel du processus enfant.

    • env (Object) Paires clé-valeur d'environnement.

    • execPath (Chaîne) Exécutable utilisé pour créer le processus enfant.

    • execArgv (Array) Liste des arguments de chaîne passés à l'exécutable (par défaut: process.execArgv).

    • silent (Boolean) Si true, stdin, stdout et stderr de l'enfant seront redirigés vers le parent, sinon ils seront hérités du parent, voir les options "pipe" et "inherit" pour stdio de spawn () pour plus détails (la valeur par défaut est false).

    • uid (Number) Définit l'identité de l'utilisateur du processus.

    • gid (Number) Définit l'identité de groupe du processus.

La méthode fork retourne un objet avec un canal de communication intégré en plus d'avoir toutes les méthodes dans une instance ChildProcess normale.

Exemple

Créez deux fichiers js nommés support.js et 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);
   });
}

Maintenant, exécutez le master.js pour voir le résultat -

$ node master.js

Vérifiez la sortie. Le serveur a démarré.

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