Cette fois, je vais vous apporter une explication détaillée de l'utilisation de process et child_process. Quelles sont les précautions lors de l'utilisation de process et child_process. Voici des cas pratiques, jetons un coup d'œil.
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
Node.js est que chaque application est un objet instance de la classe de processus.
Plusieurs attributs importants dans le processus
process.stdin.on('data', (chunk) => { process.stdout.write('进程接收到数据' + chunk) })
console.log(process.env)
console.log(process.env.NODE_ENV) //develop
() L'événement uncaughtException de l'objet processus est déclenché lorsque l'application lève une exception non interceptée
say() //方法不存在 process.on('uncaughtException',function(err){ console.log('捕获到一个未被处理的错误:',err); });
Le processus enfant 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 l'émergence 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 au nœud la possibilité de créer des processus enfants à volonté. La documentation officielle du nœud donne quatre méthodes pour le module child_proces, qui sont en fait mappées au système d'exploitation pour créer 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])
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 le résultat de l'exécution. Le processus enfant sortant du fork doit être le processus de nœudSyntaxe : child_process.spawn(command, [args], [options])
options 参数为一个对象,用于指定开启子进程时使用的选项
const { spawn } = require('child_process') const path = require('path') let child1 = spawn('node', ['test1.js', 'yanyongchao'], { stdio: ['pipe', 'pipe', 'pipe'], // 三个元素数组 下面会详解 cwd: dirname, 子进程工作目录 env: process.env, 环境变量 detached: true // 如果为true,当父进程不存在时也可以独立存在 })
其实上面都好理解除了sdtio数组,下面来一起分析stdio
stdio
stdio是一个数组,用来设置标准输入,标准输出,错误输出。个人理解
pipe:父进程和子进程之间建立一个管道
主进程代码
const path = require('path') const { spawn } = require('child_process') let p = spawn('node', ['childs_t.js'], { cwd: path.join(dirname, 'childs'), stdio: ['pipe', 'pipe', process.stderr] }) p.stdout.on('data', (data) => { console.log(data.toString()) }) // 这里用stdout原因: 子进程的数据流与常规理解的数据流方向相反, // stdin:写入流,stdout、stderr:读取流。
子进程代码
process.stdout.write('asd')
如果在stdio中放一个流,process.stdout,process.stdin
主进程代码
const { spawn } = require('child_process') const path = require('path') // 如果放的是一个流,则意味着父进程和子进程共享一个流 const p = spawn('node', ['child_t.js'], { cwd: path.join(dirname, 'childs'), stdio: [process.stdin, process.stdout, process.stderr] })
子进程代码
process.stdout.write('asd') //控制台会输出asd
ipc
主进程代码
const path = require('path') const { spawn } = require('child_process') let p = spawn('node', ['child_t.js'], { cwd: path.join(dirname, 'childs'), stdio: ['ipc', 'pipe', 'pipe'] }) p.on('message', (msg) => { console.log(msg) }) p.send('hello chhild_process')
子进程代码
process.on('message', (msg) => { process.send('子进程' + msg) }) // child.send(message,[sendHandle]);//在父进程中向子进程发送消息 // process.send(message,[sendHandle]);//在子进程中向主进程发送消息
detached模式
const { spawn } = require('child_process') const fs = require('fs') const path = require('path') let out = fs.openSync(path.join(dirname, 'childs/msg.txt'), 'w', 0o666) let p = spawn('node', ['test4.js'], { detached: true, //保证父进程结束,子进程仍然可以运行 stdio: 'ignore', cwd: path.join(dirname, 'childs') }) p.unref() p.on('close', function() { console.log('子进程关闭') }) p.on('exit', function() { console.log('子进程退出') }) p.on('error', function(err) { console.log('子进程1开启失败' + err) })
fork开启一个子进程
衍生一个新的 Node.js 进程,并通过建立一个 IPC 通讯通道来调用一个指定的模块,该通道允许父进程与子进程之间相互发送信息
fork方法返回一个隐式创建的代表子进程的ChildProcess对象
子进程的输入/输出操作执行完毕后,子进程不会自动退出,必须使用process.exit()方法显式退出
子进程代码
const { fork } = require('child_process') const path = require('path') let child = fork(path.join(dirname, 'childs/fork1.js')) child.on('message', (data) => { console.log('父进程接收到消息' + data) }) child.send('hello fork') child.on('error', (err) => { console.error(err) })
子进程代码
process.on('message', (m, setHandle) => { console.log('子进程接收到消息' + m) process.send(m) //sendHandle是一个 net.Socket 或 net.Server 对象 })
exec开启子进程
// exec同步执行一个shell命令 let { exec } = require('child_process') let path = require('path') // 用于使用shell执行命令, 同步方法 let p1 = exec('node exec.js a b c', {cwd: path.join(dirname, 'childs')}, function(err, stdout, stderr) { console.log(stdout) })
execFile开启子进程
let { execFile } = require('child_process') let path = require('path') let p1 = execFile('node', ['exec.js', 'a', 'b', 'c'], { cwd: path.join(dirname, 'childs') }, function(err, stdout, stderr) { console.log(stdout) })
相信看了本文案例你已经掌握了方法,更多精彩请关注php中文网其它相关文章!
推荐阅读:
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!