欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

在nodejs中创建child process的方法

程序员文章站 2022-03-20 14:20:33
简介nodejs的main event loop是单线程的,nodejs本身也维护着worker pool用来处理一些耗时的操作,我们还可以通过使用nodejs提供的worker_threads来手动...

简介

nodejs的main event loop是单线程的,nodejs本身也维护着worker pool用来处理一些耗时的操作,我们还可以通过使用nodejs提供的worker_threads来手动创建新的线程来执行自己的任务。

本文将会介绍一种新的执行nodejs任务的方式,child process。

child process

lib/child_process.js提供了child_process模块,通过child_process我们可以创建子进程。

注意,worker_threads创建的是子线程,而child_process创建的是子进程。

在child_process模块中,可以同步创建进程也可以异步创建进程。同步创建方式只是在异步创建的方法后面加上sync。

创建出来的进程用childprocess类来表示。

我们看下childprocess的定义:

可以看到childprocess也是一个eventemitter,所以它可以发送和接受event。

childprocess可以接收到event有5种,分别是close,disconnect,error,exit和message。

当调用父进程中的 subprocess.disconnect() 或子进程中的 process.disconnect() 后会触发 disconnect 事件。

当出现无法创建进程,无法kill进程和向子进程发送消息失败的时候都会触发error事件。

当子进程结束后时会触发exit事件。

当子进程的 stdio 流被关闭时会触发 close 事件。 注意,close事件和exit事件是不同的,因为多个进程可能共享同一个stdio,所以发送exit事件并不一定会触发close事件。

看一个close和exit的例子:

最后是message事件,当子进程使用process.send() 发送消息的时候就会被触发。

childprocess中有几个标准流属性,分别是stderr,stdout,stdin和stdio。

stderr,stdout,stdin很好理解,分别是标准错误,标准输出和标准输入。

我们看一个stdout的使用:

stdio实际上是stderr,stdout,stdin的集合:

其中stdio[0]表示的是stdin,stdio[1]表示的是stdout,stdio[2]表示的是stderr。

如果在通过stdio创建子进程的时候,这三个标准流被设置为除pipe之外的其他值,那么stdin,stdout和stderr将为null。

我们看一个使用stdio的例子:

通常情况下父进程中维护了一个对子进程的引用计数,只有在当子进程退出之后父进程才会退出。

这个引用就是ref,如果调用了unref方法,则允许父进程独立于子进程退出。

最后,我们看一下如何通过childprocess来发送消息:

其中message就是要发送的消息,callback是发送消息之后的回调。

sendhandle比较特殊,它可以是一个tcp服务器或socket对象,通过将这些handle传递给子进程。子进程将会在message事件中,将该handle传递给callback函数,从而可以在子进程中进行处理。

我们看一个传递tcp server的例子,首先看主进程:

再看子进程:

可以看到子进程接收到了server handle,并且在子进程中监听connection事件。

下面我们看一个传递socket对象的例子:

subprocess.js的内容:

主进程创建了两个subprocess,一个处理特殊的优先级, 一个处理普通的优先级。

异步创建进程

child_process模块有4种方式可以异步创建进程,分别是child_process.spawn()、child_process.fork()、child_process.exec() 和 child_process.execfile()。

先看一个各个方法的定义:

其中child_process.spawn是基础,他会异步的生成一个新的进程,其他的fork,exec和execfile都是基于spawn来生成的。

fork会生成新的node.js 进程。

exec和execfile是以新的进程执行新的命令,并且带有callback。他们的区别就在于在windows的环境中,如果要执行.bat或者.cmd文件,没有shell终端是执行不了的。这个时候就只能以exec来启动。execfile是无法执行的。

或者也可以使用spawn。

我们看一个在windows中使用spawn和exec的例子:

同步创建进程

同步创建进程可以使用child_process.spawnsync()、child_process.execsync() 和 child_process.execfilesync() ,同步的方法会阻塞 node.js 事件循环、暂停任何其他代码的执行,直到子进程退出。

通常对于一些脚本任务来说,使用同步创建进程会比较常用。

到此这篇关于在nodejs中创建child process的方法的文章就介绍到这了,更多相关nodejs中创建child process内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!