Maison  >  Article  >  interface Web  >  Comment apprendre les modules process et child_process dans node (tutoriel détaillé)

Comment apprendre les modules process et child_process dans node (tutoriel détaillé)

亚连
亚连original
2018-06-01 10:41:121795parcourir

Cet article présente principalement les notes d'étude du module node's process et child_process. Maintenant, je le partage avec vous et le donne comme référence.

Après avoir lutté avec le processus pendant une semaine, j'ai enfin compris le document obscur et difficile et je suis prêt à partager ma compréhension avec tout le monde. J'espère également que chacun pourra faire part de ses opinions

<.>Processus Le concept de

  1. dans Node.js est que chaque application est un objet instance de la classe de processus.

  2. Utilisez l'objet processus pour représenter l'application. Il s'agit d'un objet global à travers lequel vous pouvez obtenir les attributs de l'application Node.jsy ainsi que l'utilisateur et l'environnement exécutant les méthodes et le programme. événements.

Plusieurs attributs importants dans le processus

  1. flux lisible d'entrée standard stdin

  2. flux inscriptible d'entrée standard stdout

  3. flux de sortie d'erreur standard stderr

  4. tableau de paramètres d'entrée du terminal argv

  5. Informations sur l'environnement du système d'exploitation env

  6. ID du processus d'application PID

stdin et stdout

process.stdin.on(&#39;data&#39;, (chunk) => {
 process.stdout.write(&#39;进程接收到数据&#39; + chunk)
})
Exécuter results

argv

console.log(process.env)

env : saisissez export NODE_ENV=develop

console.log(process.env.NODE_ENV) //develop
Méthode de processus

    process.memoryUsage() Afficher les informations sur l'utilisation de la mémoire
  1. process.nextTick( ) La boucle d'événement actuelle est exécutée et la fonction de rappel est exécutée
  2. process.chdir() La méthode chdir est utilisée pour modifier le répertoire de travail actuel utilisé dans les applications Node.js
  3. process.cwd() Le répertoire de travail actuel du processus
  4. process.kill() Tuer le processus
  5. process.uncaughtException() déclenche l'événement uncaughtException de l'objet processus lorsque l'application lève une exception non interceptée
say() //方法不存在
process.on(&#39;uncaughtException&#39;,function(err){
 console.log(&#39;捕获到一个未被处理的错误:&#39;,err);
});
child_process

child Process est au centre de la discussion d'aujourd'hui. Je ne comprends pas non plus certaines choses. J'espère pouvoir communiquer davantage avec vous

Le contexte de child_process

Dans Node. .js, un seul thread effectue toutes les opérations. Si une opération nécessite une grande quantité de ressources CPU, les opérations suivantes devront attendre.

Dans Node.js, un module child_process est fourni, grâce auquel plusieurs processus enfants peuvent être démarrés, l'espace mémoire peut être partagé entre plusieurs processus enfants et l'échange d'informations peut être réalisé grâce à la communication mutuelle des processus enfants.

Le module child_process donne à node la possibilité de créer des processus enfants à volonté. Le document officiel de node donne quatre méthodes pour le module child_proces. Le mappage vers le système d'exploitation crée en fait des processus enfants. Mais pour les développeurs, les API de ces méthodes sont un peu différentes

child_process.exec(command[, options][, callback]) démarre le

processus enfant pour exécuter la commande shell, ce qui peut être fait via le paramètre de rappel Obtenez le résultat de l'exécution du script shell


child_process.execfile(file[, args][, options][, callback])

Différent du type exec, il n'exécute pas de commande shell mais un fichier exécutable


child_process.spawn(command[, args][, options]) exécute uniquement une commande shell et n'a pas besoin d'obtenir le résultat de l'exécution

child_process.fork(modulePath[ , args][, options ]) Vous pouvez utiliser le nœud

pour exécuter le fichier .js, et il n'est pas nécessaire d'obtenir les résultats de l'exécution. Le processus enfant sortant du fork doit être un processus de nœud


spawn

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

    commande Paramètres qui doivent être spécifiés, spécifiez la commande à exécuter
  1. tableau args, qui stocke tous les paramètres requis pour exécuter la commande
  2. Le paramètre
  3. options est un objet utilisé pour spécifier les options utilisées lors du démarrage d'un processus enfant
En fait, ce qui précède est facile à comprendre à l'exception du tableau sdtio. Analysons stdio
const { spawn } = require(&#39;child_process&#39;)
const path = require(&#39;path&#39;)

let child1 = spawn(&#39;node&#39;, [&#39;test1.js&#39;, &#39;yanyongchao&#39;], {
 stdio: [&#39;pipe&#39;, &#39;pipe&#39;, &#39;pipe&#39;], // 三个元素数组 下面会详解
 cwd: __dirname, 子进程工作目录
 env: process.env, 环境变量
 detached: true // 如果为true,当父进程不存在时也可以独立存在
})

stdio

stdio est un tableau utilisé pour définir l'entrée standard, la sortie standard et la sortie d'erreur. Compréhension personnelle

pipe : Établir un pipeline entre le processus parent et le processus enfant

Code du processus principal

Code du processus enfant
const path = require(&#39;path&#39;)
const { spawn } = require(&#39;child_process&#39;)

let p = spawn(&#39;node&#39;, [&#39;childs_t.js&#39;], {
 cwd: path.join(__dirname, &#39;childs&#39;),
 stdio: [&#39;pipe&#39;, &#39;pipe&#39;, process.stderr]
})

p.stdout.on(&#39;data&#39;, (data) => {
 console.log(data.toString())
}) 
// 这里用stdout原因: 子进程的数据流与常规理解的数据流方向相反,
// stdin:写入流,stdout、stderr:读取流。

Si vous mettez un flux dans stdio, process.stdout, process.stdin
process.stdout.write(&#39;asd&#39;)

code du processus principal

code du sous-processus
const { spawn } = require(&#39;child_process&#39;)
const path = require(&#39;path&#39;)

// 如果放的是一个流,则意味着父进程和子进程共享一个流
const p = spawn(&#39;node&#39;, [&#39;child_t.js&#39;], {
 cwd: path.join(__dirname, &#39;childs&#39;),
 stdio: [process.stdin, process.stdout, process.stderr]
})

process.stdout.write(&#39;asd&#39;) //控制台会输出asd
ipc

Code du processus principal

Code du sous-processus
const path = require(&#39;path&#39;)
const { spawn } = require(&#39;child_process&#39;)

let p = spawn(&#39;node&#39;, [&#39;child_t.js&#39;], {
 cwd: path.join(__dirname, &#39;childs&#39;),
 stdio: [&#39;ipc&#39;, &#39;pipe&#39;, &#39;pipe&#39;]
})

p.on(&#39;message&#39;, (msg) => {
 console.log(msg)
})

p.send(&#39;hello chhild_process&#39;)

process.on(&#39;message&#39;, (msg) => {
 process.send(&#39;子进程&#39; + msg)
})
// child.send(message,[sendHandle]);//在父进程中向子进程发送消息
// process.send(message,[sendHandle]);//在子进程中向主进程发送消息
mode détaché

const { spawn } = require(&#39;child_process&#39;)
const fs = require(&#39;fs&#39;)
const path = require(&#39;path&#39;)
let out = fs.openSync(path.join(__dirname, &#39;childs/msg.txt&#39;), &#39;w&#39;, 0o666)

let p = spawn(&#39;node&#39;, [&#39;test4.js&#39;], {
 detached: true, //保证父进程结束,子进程仍然可以运行
 stdio: &#39;ignore&#39;,
 cwd: path.join(__dirname, &#39;childs&#39;)
})

p.unref()

p.on(&#39;close&#39;, function() {
 console.log(&#39;子进程关闭&#39;)
})

p.on(&#39;exit&#39;, function() {
 console.log(&#39;子进程退出&#39;)
})

p.on(&#39;error&#39;, function(err) {
 console.log(&#39;子进程1开启失败&#39; + err)
})
fork ouvre un processus enfant

    génère un nouveau processus Node.js et appelle un module spécifié en établissant un canal de communication IPC, qui permet au processus parent de communiquer avec Les processus enfants s'envoient des informations
  1. La méthode fork renvoie un objet ChildProcess créé implicitement représentant le processus enfant
  2. Entrée du processus enfant/ Une fois l'opération de sortie terminée, le processus enfant ne se terminera pas automatiquement. Vous devez utiliser la méthode process.exit() pour quitter explicitement le
  3. code du processus enfant

<.>Code du processus enfant

const { fork } = require(&#39;child_process&#39;)
const path = require(&#39;path&#39;)
let child = fork(path.join(__dirname, &#39;childs/fork1.js&#39;))

child.on(&#39;message&#39;, (data) => {
 console.log(&#39;父进程接收到消息&#39; + data)
})

child.send(&#39;hello fork&#39;)

child.on(&#39;error&#39;, (err) => {
 console.error(err)
})

exec ouvre le processus enfant
process.on(&#39;message&#39;, (m, setHandle) => {
 console.log(&#39;子进程接收到消息&#39; + m)
 process.send(m) //sendHandle是一个 net.Socket 或 net.Server 对象
})

execFile ouvre le processus enfant
// exec同步执行一个shell命令
let { exec } = require(&#39;child_process&#39;)
let path = require(&#39;path&#39;)

// 用于使用shell执行命令, 同步方法

let p1 = exec(&#39;node exec.js a b c&#39;, {cwd: path.join(__dirname, &#39;childs&#39;)}, function(err, stdout, stderr) {
 console.log(stdout)
})

let { execFile } = require(&#39;child_process&#39;)
let path = require(&#39;path&#39;)

let p1 = execFile(&#39;node&#39;, [&#39;exec.js&#39;, &#39;a&#39;, &#39;b&#39;, &#39;c&#39;], {
 cwd: path.join(__dirname, &#39;childs&#39;)
}, function(err, stdout, stderr) {
 console.log(stdout)
})

上面是我整理给大家的,希望今后会对大家有帮助。

相关文章:

根据vue里面设置全局变量或者数据方法(详细教程)

利用jquery点击回车键实现登录效果(详细教程)

如何在vue2中设置全局变量?(详细教程)

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn