如何在nodejs中创建一个子进程方法

  介绍

本篇文章为大家展示了如何在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中创建一个子进程方法