Latest web development tutorials

Node.js multi-processus

Nous savons tous que Node.js est en mode mono-thread, mais il est utilisé pour traiter event-driven, qui nous aidera à créer plusieurs sous-processus sur le système de cpu multi-core, ce qui améliore les performances en même temps.

Chaque enfant est toujours avec trois objets de flux: child.stdin, child.stdout et child.stderr. Ils peuvent partager le processus parent de flux stdio, ou il peut également être orienté objet de flux indépendant.

Node fournit des modules child_process pour créer un processus enfant, par:

  • exec - child_process.exec processus enfant utilisation Exécuter, le tampon de sortie de processus enfant, et la sortie du processus enfant est retourné sous la forme d'une fonction de rappel des paramètres.

  • frayer - child_process.spawn en utilisant les paramètres de ligne de commande spécifiques pour créer un nouveau processus.

  • fourche - child_process.fork est fraient () forme spéciale pour le module en cours d' exécution dans l'enfant, tels que la fourche ( './ son.js') correspond à frayer ( «nœud», [ ' ./son.js' ]).La différence est la méthode de spawn, fourchette entre le processus parent et l'enfant, établir un conduit de communication pour la communication entre les processus.


méthode exec ()

child_process.exec processus enfant utilisation Exécuter, le tampon de sortie de processus enfant, et la sortie du processus enfant est retourné sous la forme d'une fonction de rappel des paramètres.

La syntaxe est la suivante:

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

Paramètres

Les paramètres sont les suivants:

command: String, la commande à exécuter, les paramètres séparés par des espaces

Options: objets peuvent être:

  • Le répertoire de travail courant cwd, string, le processus enfant
  • env, l'objet des variables environnementales clés
  • encodage, string, codage de caractères (par défaut: 'utf8')
  • shell, string, pour exécuter la commande Shell (par défaut: sous UNIX est /bin/sh , comme dans Windows cmd.exe , Shell devrait être en mesure d'identifier le -c switch sous UNIX, ou /s /c dans Windows. dans Windows, la ligne parsing de commande compatible cmd.exe )
  • timeout, numérique, délai d'attente (par défaut: 0)
  • maxBuffer, numérique, la mémoire tampon maximale dans stdout ou stderr sont autorisés à exister (binaire), de sorte que si l'enfant sera tué au-delà (par défaut: 200 * 1024)
  • killSignal, signal de fin de chaîne (par défaut: 'SIGTERM')
  • uid, numérique, définissez l'ID utilisateur du processus
  • gid, définir un groupe de processus numérique ID

callback: fonction de rappel a trois arguments erreur, stdout et stderr.

exec () retourne le tampon maximale, et d'attendre la fin du processus, une seule fois revenir le contenu de la mémoire tampon.

Exemples

Nous allons créer deux fichiers js support.js et master.js.

Code de fichier support.js:

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

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

Mise en œuvre du code ci-dessus, la sortie est:

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

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

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

stderr: 

méthode de spawn ()

child_process.spawn en utilisant les paramètres de ligne de commande spécifiques pour créer un nouveau processus, la syntaxe est la suivante:

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

Paramètres

Les paramètres sont les suivants:

commande: la commande à exécuter

args: paramètre de chaîne Arraytableau

Options Object

  • Cwd Chaîne répertoire de travail courant du processus de l'enfant
  • variables paires clé-valeur de l'environnement de l'objet d'env
  • Tableau stdio | configuration String stdio subprocess
  • Boolean détaché Cet enfant deviendra un chef de file du groupe de processus
  • Nombre uid pour définir l'ID utilisateur du processus
  • Nombre mis en gid groupe de processus ID

méthode spawn () renvoie le flux (stdout et stderr), utilisé dans le processus de retour de grandes quantités de données. Une fois que le processus a commencé lorsque le spawn () a commencé à recevoir une réponse.

Exemples

Nous allons créer deux fichiers js support.js et master.js.

Code de fichier support.js:

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

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

Mise en œuvre du code ci-dessus, la sortie est:

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

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

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

子进程已退出,退出码 0

méthode de fourche

child_process.fork est une forme particulière de spawn () méthode pour créer des processus, la syntaxe est la suivante:

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

Paramètres

Les paramètres sont les suivants:

ModulePath: String, pour être exécuté dans un module de traitement de l' enfant

args: paramètre de chaîne Arraytableau

Options: Object

  • Cwd Chaîne répertoire de travail courant du processus de l'enfant
  • variables paires clé-valeur de l'environnement de l'objet d'env
  • execPath Chaîne créer un processus du fichier exécutable de l'enfant
  • fichier exécutable (par défaut: process.execArgv) de chaîne paramètre tableau execArgv tableau enfant
  • Si Boolean silencieuse true , l'enfant stdin , stdout et stderr sera lié au processus parent, sinon, ils seront hérités du processus parent. (Par défaut: false )
  • Nombre uid pour définir l'ID utilisateur du processus
  • Nombre mis en gid groupe de processus ID

L'objet retourné, en plus de toutes les méthodes ont par exemple ChildProcess, il y a un canal de communication intégré.

h3> Exemples

Nous allons créer deux fichiers js support.js et master.js.

Code de fichier support.js:

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

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

Mise en œuvre du code ci-dessus, la sortie est:

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