Node.js multi-processus


Nous savons tous que Node.js fonctionne en mode monothread, mais il utilise des événements pour gérer la concurrence, ce qui nous aide à créer plusieurs processus enfants sur des systèmes CPU multicœurs, améliorant ainsi les performances.

Chaque processus enfant a toujours trois objets de flux : child.stdin, child.stdout et child.stderr. Ils peuvent partager le flux stdio du processus parent ou être des objets de flux redirigés indépendants.

Node fournit le module child_process pour créer un processus enfant. Les méthodes sont :

  • exec - child_process.exec utilise le processus enfant pour s'exécuter. commandes et met en cache le processus enfant. La sortie du processus et renvoie la sortie du processus enfant sous la forme de paramètres de fonction de rappel.

  • spawn - child_process.spawn crée un nouveau processus en utilisant les arguments de ligne de commande spécifiés.

  • fork - child_process.fork est une forme spéciale de spawn(), utilisée pour les modules exécutés dans des processus enfants, tels que fork('./son.js ') équivaut à spawn('node', ['./son.js']) . Différent de la méthode spawn, fork établira un canal de communication entre le processus parent et le processus enfant pour la communication entre les processus.


Méthode exec()

child_process.exec utilise le processus enfant pour exécuter des commandes, met en cache la sortie du processus enfant et utilise la sortie du processus enfant lorsque les paramètres de la fonction de rappel reviennent dans le formulaire.

La syntaxe est la suivante :

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

Paramètres

La description du paramètre est la suivante :

commande : chaîne, la commande à exécuter, les paramètres sont séparés par des espaces

options : objet, peut être :

  • cwd, string, répertoire de travail actuel du processus enfant

  • env, paire clé-valeur de variable d'environnement d'objet

  • encodage, chaîne, encodage de caractères (par défaut : 'utf8')

  • shell, string, le Shell qui exécutera la commande (par défaut : /bin/sh sous UNIX, cmd.exe sous Windows, le shell devrait être capable de reconnaître le commutateur -c sous UNIX , ou /s /c Sous Windows. Sous Windows, l'analyse de la ligne de commande doit être compatible cmd.exe)

  • timeout, number, timeout (par défaut : 0) >

    maxBuffer, number. , le tampon maximum (binaire) autorisé dans stdout ou stderr, s'il est dépassé, le processus enfant sera tué (par défaut : 200*1024)
  • killSignal, string, end signal (par défaut : ' SIGTERM')
  • uid, ​​​​number, définit l'ID du processus utilisateur
  • gid, Number, définit l'ID du processus group
  • callback :
Fonction de rappel, comprenant trois paramètres error, stdout et stderr.

La méthode exec() renvoie le plus grand tampon, attend la fin du processus et renvoie immédiatement le contenu du tampon.

Exemple

Créons deux fichiers js support.js et master.js.

Code du fichier support.js :

console.log("进程 " + process.argv[2] + " 执行。" );

Code du fichier 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);
   });
}

Exécutez le code ci-dessus, le résultat de sortie est :

La méthode

$ node master.js 
子进程已退出,退出码 0
stdout: 进程 1 执行。

stderr: 
子进程已退出,退出码 0
stdout: 进程 0 执行。

stderr: 
子进程已退出,退出码 0
stdout: 进程 2 执行。

stderr:

spawn()

child_process.spawn utilise les paramètres de ligne de commande spécifiés pour créer un nouveau processus. Le format de syntaxe est le suivant :

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

Paramètres

.

Description du paramètre comme suit :

commande : La commande à exécuter

args : Tableau de paramètres de chaîne de tableau

options Objet

  • cwd String Le répertoire de travail actuel du processus enfant

  • env Objet variable d'environnement clé-valeur paire

  • stdio Array|String configuration stdio du processus enfant

  • détaché Booléen Ce processus enfant deviendra le leader du groupe de processus

  • Numéro uid Définir l'ID du processus utilisateur

  • Numéro gid Définir l'ID du groupe de processus

La méthode spawn() renvoie le flux (stdout & stderr), utilisée lorsque le processus renvoie de grandes quantités de données. spawn() commence à recevoir des réponses dès que le processus commence à s'exécuter.

Exemple

Créons deux fichiers js support.js et master.js.

Code du fichier support.js :

console.log("进程 " + process.argv[2] + " 执行。" );

Code du fichier 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);
   });
}

Exécutez le code ci-dessus, le résultat de sortie est :

$ node master.js stdout: 进程 0 执行。

子进程已退出,退出码 0
stdout: 进程 1 执行。

子进程已退出,退出码 0
stdout: 进程 2 执行。

子进程已退出,退出码 0

La méthode fork

child_process.fork est une forme spéciale de la méthode spawn(), utilisée pour créer un processus. Le format de syntaxe est le suivant :

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

Parameters

<. 🎜>La description du paramètre est la suivante :

modulePath : String, le module à exécuter dans le processus enfant

args : Array string tableau de paramètres

options  : Objet

  • cwd String Le répertoire de travail actuel du processus enfant

  • env Paire clé-valeur de variable d'environnement d'objet

  • execPath String Créer le fichier exécutable du processus enfant

  • execArgv Array Le tableau de paramètres de chaîne de le fichier exécutable du processus enfant (par défaut : process.execArgv)

  • Booléen silencieux Si

    , les true, stdin et stdout du processus enfant seront associés avec le processus parent, sinon ils seront hérités du processus parent. (Par défaut : stderr) false

  • uid Number Définissez l'ID du processus utilisateur

  • gid Number Définissez l'ID du groupe de processus

En plus d'avoir toutes les méthodes de l'instance ChildProcess, l'objet renvoyé dispose également d'un canal de communication intégré.

h3>Exemple

Créons deux fichiers js support.js et master.js.

Code du fichier support.js :

console.log("进程 " + process.argv[2] + " 执行。" );

Code du fichier 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);
   });
}

Exécutez le code ci-dessus, le résultat de sortie est :

$ node master.js 
进程 0 执行。
子进程已退出,退出码 0
进程 1 执行。
子进程已退出,退出码 0
进程 2 执行。
子进程已退出,退出码 0