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 compatiblecmd.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 :
La méthode exec() renvoie le plus grand tampon, attend la fin du processus et renvoie immédiatement le contenu du tampon.
ExempleCré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
etstdout
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
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