本篇文章为大家展示了如何在nodejs中创建一个子进程方法,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。
简介
nodejs的主事件循环是单线程的,nodejs本身也维护着工人池用来处理一些耗时的操作,我们还可以通过使用nodejs提供的worker_threads来手动创建新的线程来执行自己的任务。
子进程
lib/child_process。js提供了child_process模块,通过child_process我们可以创建子进程。
注意,worker_threads创建的是子线程,而child_process创建的是子进程。
在child_process模块中,可以同步创建进程也可以异步创建进程。同步创建方式只是在异步创建的方法后面加上同步。
创建出来的进程用ChildProcess类来表示。
我们看下ChildProcess的定义:
interface ChildProcess extends events.EventEmitter { ,stdin: Writable |,空; ,stdout: Readable |,空; ,stderr: Readable |,空; ,readonly 频道?:Pipe |,空; ,readonly stdio: [ Writable 才能|,null,,//stdin Readable 才能|,null,,//stdout Readable 才能|,null,//, stderr Readable 才能|,Writable |, null |,定义,//,额外的 Readable 才能|,Writable |, null |, undefined //额外的 ,); ,readonly 死亡:布尔; ,readonly pid:数量; ,readonly 连接:布尔; ,readonly exitCode: number |,空; ,readonly signalCode: NodeJS.Signals |,空; ,readonly spawnargs: string []; ,readonly spawnfile:字符串; ,杀死(信号?:NodeJS.Signals |,数字):,布尔; ,发送(消息:可序列化的,回调?:,(错误:,Error |, null),=祝辞,空白):,布尔; ,发送(消息:可序列化的,,sendHandle ?:, sendHandle,,回调?:,(错误:,Error |, null),=祝辞,空白):,布尔; ,发送(消息:可序列化的,,sendHandle ?:, sendHandle,,选择?:,MessageOptions,,回调?:,(错误:,Error |, null),=祝辞,空白):,布尔; ,断开():空白; unref():大敌;空白; ,裁判():空白;/* * *才能events.EventEmitter ,,*,1只 *才能,2只断开连接 ,,*,3只错误 *才能,4只退出 *,才能5只消息 ,*/,…… 以前,}>可以看到ChildProcess也是一个EventEmitter,所以它可以发送和接受事件。
ChildProcess可以接收到事件有5种,分别是接近,断开,错误,退出和信息。
当调用父进程中的subprocess.disconnect()或子进程中的process.disconnect()后会触发断开事件。
当出现无法创建进程,无法杀进程和向子进程发送消息失败的时候都会触发错误事件。
当子进程结束后时会触发退出事件。
当子进程的stdio流被关闭时会触发近事件。注意,近事件和退出事件是不同的,因为多个进程可能共享同一个stdio,所以发送出口事件并不一定会触发近事件。
看一个亲密和退出的例子:
const {, spawn },=,要求(& # 39;child_process& # 39;); const ls =,产卵(& # 39;ls # 39;,, (& # 39; -lh& # 39;,, & # 39;/usr # 39;]); ls.stdout.on(& # 39;数据# 39;,,(数据),=祝辞,{ ,console.log (stdout: ${数据}'); }); ls.on(& # 39;关闭# 39;,,(代码),=祝辞,{ ,console.log(“子进程使用代码,美元(代码),关闭所有,stdio”); }); ls.on(& # 39;退出# 39;,,(代码),=祝辞,{ ,console.log(“子进程使用代码,美元(代码),退出”); });最后是消息事件,当子进程使用process.send()发送消息的时候就会被触发。
ChildProcess中有几个标准流属性,分别是stderr, stdout, stdin和stdio。
stderr, stdout, stdin很好理解,分别是标准错误,标准输出和标准输入。
我们看一个stdout的使用:
const {, spawn },=,要求(& # 39;child_process& # 39;); const subprocess =,产卵(& # 39;ls # 39;); subprocess.stdout.on(& # 39;数据# 39;,,(数据),=祝辞,{ ,console.log(“接收到数据块,${数据}'); });stdio实际上是stderr, stdout, stdin的集合:
readonly stdio:, Writable 才能|,null,,//stdin Readable 才能|,null,,//stdout Readable 才能|,null,//, stderr Readable 才能|,Writable |, null |,定义,//,额外的 Readable 才能|,Writable |, null |, undefined //额外的 以前,];如何在nodejs中创建一个子进程方法