在 Node.js 中,子进程管理可以帮助我们同时执行多个进程,达到提高程序的执行效率的效果。一般用于需要耗费时间或计算复杂度的任务,或是需要和系统交互的操作,比如读写文件等。
Node.js 提供了一系列子进程管理模块,包括 child_process、cluster 等。其中, child_process 模块是比较常用的,可以启动一个新的进程,并通过进程间的通信机制,读取子进程输出,控制子进程的行为等。
创建子进程
我们可以通过 Node.js 中的 child_process 模块来创建子进程,如下所示:
const { spawn } = require('child_process'); const child = spawn('node', ['child.js']);
在上面的代码中,我们使用了 spawn 方法来创建了一个名为 child.js 的子进程。这个子进程的脚本是一个简单的输出语句,如下所示:
// child.js console.log('子进程已启动');
子进程间通信
通过 child_process 模块中的 exec、spawn 和 fork 方法创建的子进程都可以与父进程之间共享标准输入输出和错误输出流。而父、子进程之间则可通过 IPC(进程间通信) 进行通信。
下面的示例演示了在父子进程之间发送消息和接收消息的过程:
-- -------------------- ---- ------- -- ----- ----- - ----- - - ------------------------- ----- ----- - ------------- ------------- - ------ --- -- -- ------ --- ------------------- ----- -- - --------------------------------- --- ------------------------
// 子进程代码 process.on('message', (msg) => { console.log(`子进程收到主进程消息:${msg}`); process.send('来自子进程的消息!'); });
在上面的代码中,我们设置子进程的 stdio 配置项,将 IPC 通道也添加进去。然后通过子进程的 send 方法向子进程发送消息,子进程则通过 process.on('message', ...) 监听到消息并回应。
子进程的生命周期
父进程可以通过 child 进程对象的 exit 事件监听到子进程的退出事件。
child.on('exit', (code, signal) => { console.log(`子进程退出,退出码 ${code},信号 ${signal}`); });
在子进程意外退出,或运行时出现错误的情况下,我们可以通过监听子进程的 error 事件来捕获错误信息:
child.on('error', (err) => { console.error('子进程异常退出', err); });
控制子进程
父进程也可以通过 kill 方法终止子进程:
child.kill();
在默认情况下, Node.js 在子进程退出后会立即清理掉它的所有资源。但我们也可以通过 kill 传递参数,来改变这个行为。如下所示,我们将 extraTime 设置为 2000 毫秒。这将导致 Node.js 在终止子进程后等待额外的 2 秒钟,然后清理子进程的所有资源。
child.kill('SIGTERM', { extraTime: 2000 });
实际应用
我们可以将子进程的运行转化为异步操作,在异步操作的回调函数中执行相应的子进程任务,从而达到提高工作效率的目的。
比如,我们可以将 Webpack 任务封装到子进程中:
-- -------------------- ---- ------- ----- - ----- - - ------------------------- -------- -------------- - ------ --- ----------------- ------- -- - ----- -------------- - ---------------- ------------ ---------------------- -------------------------------- ------ -- - --------------------------- --- -------------------------------- ------ -- - --------------------------- --- -------------------------- ------ -- - -- ----- --- -- - ---------- -------------- ----- ---- ---- ----------- - ---- - ---------- - --- --- - -------------- -------- -- - -------------------- ------ -- ------------ -- - ---------------------- ------- ----- ---
在上面的代码中,我们使用 Promise 对象来管理 Webpack 子进程,当子进程运行完以后,通过 resolve 或 reject 方法返回相关信息,从而达到异步执行 Node.js 的目的。
总结
在 Node.js 中,子进程管理技术可帮助我们执行耗费时间或计算复杂度的任务,并提高程序执行效率。我们可以通过 child_process 模块来创建,管理并与子进程之间进行通信。在实际应用中,子进程的运行通常转化为异步操作,在异步回调函数中执行相应的任务。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/64d29f0bb5eee0b5259f7390