返回
用 child_process 管理子进程:让 Node.js 掌控一切
前端
2023-11-22 21:48:23
在这个多任务处理的时代,Node.js 的 child_process 模块应运而生,它使我们能够在 Node.js 脚本中创建、管理和通信子进程。本指南将带领你领略 child_process 模块的强大功能,为你揭开子进程管理的神秘面纱。
-
子进程 API 简介
child_process 模块提供了丰富的 API 来创建和管理子进程,主要包括以下几个方法:
- spawn():创建一个新的子进程,并返回一个 ChildProcess 对象。
- exec():执行一个 shell 命令,并返回一个 Promise 对象。
- execFile():执行一个可执行文件,并返回一个 Promise 对象。
- fork():创建一个新的子进程,并返回一个 ChildProcess 对象。与 spawn() 不同的是,fork() 会复制当前进程的内存空间。
- cluster:这是一个模块,可帮助我们轻松地创建和管理多进程应用程序。
-
子进程的创建
2.1. 使用 spawn() 创建子进程
const { spawn } = require('child_process'); const child = spawn('ls', ['-lh']); child.stdout.on('data', (data) => { console.log(`stdout: ${data}`); }); child.stderr.on('data', (data) => { console.log(`stderr: ${data}`); }); child.on('close', (code) => { console.log(`child process exited with code ${code}`); });
2.2. 使用 exec() 执行 shell 命令
const { exec } = require('child_process'); exec('ls -lh', (err, stdout, stderr) => { if (err) { console.error(`exec error: ${err}`); return; } console.log(`stdout: ${stdout}`); console.log(`stderr: ${stderr}`); });
2.3. 使用 execFile() 执行可执行文件
const { execFile } = require('child_process'); execFile('node', ['--version'], (err, stdout, stderr) => { if (err) { console.error(`execFile error: ${err}`); return; } console.log(`stdout: ${stdout}`); console.log(`stderr: ${stderr}`); });
2.4. 使用 fork() 创建子进程
const { fork } = require('child_process'); const child = fork('child.js'); child.on('message', (msg) => { console.log(`message from child: ${msg}`); }); child.send('Hello from parent');
-
子进程的通信
子进程与父进程可以通过流对象进行通信。子进程的 stdout 和 stderr 流可以用来接收子进程的输出,而子进程的 stdin 流可以用来向子进程发送输入。
const { spawn } = require('child_process'); const child = spawn('ls', ['-lh']); child.stdout.on('data', (data) => { console.log(`stdout: ${data}`); }); child.stderr.on('data', (data) => { console.log(`stderr: ${data}`); }); child.stdin.write('Hello from parent\n');
-
使用 cluster 模块
cluster 模块可以帮助我们轻松地创建和管理多进程应用程序。它允许我们创建多个工作进程,这些工作进程可以并行处理任务。
const cluster = require('cluster'); if (cluster.isMaster) { // Create worker processes. for (let i = 0; i < numCPUs; i++) { cluster.fork(); } // Listen for worker process messages. cluster.on('message', (worker, msg) => { console.log(`message from worker ${worker.process.pid}: ${msg}`); }); } else { // Worker process code. // ... }
-
总结
child_process 模块是 Node.js 中一个强大的工具,它可以帮助我们创建、管理和通信子进程。本文介绍了 child_process 模块的主要 API 及其用法,让你能够轻松掌控子进程的世界。