一、我们都知道 Node.js是一单线程的模式运行的,但它使用的是事件驱动来处理并发。
这样有助于我们在多核CPU的系统上创建多个子进程,从而提高性能。
二、每个子进程总是带有三个流对象:child.stdin, child.stdout, 和 child.stderr。 他们可能会共享父进程的strdio流, 或者也可以是独立的被导流的流对象。
三、Node提供了child_process 模块来创建子进程,方法有:
1. exec - child_precess.exec 使用子进程执行命令,缓存子进程的输出,并将子进程的输出以回调函数参数的形式返回。
2. spawn - child_process.spawn 使用指定的命令行参数创建新进程。
3. fork - child_process.fork 是spawn的特殊形式,用于在子进程中运行的模块,如fork('./son.js')相当于spawn('node',['./son.js'])。
与spawn方法不同的是,fork会在父进程与子进程之间,建立一个通信管道,用于进程之间的通信。
四、exec() 方法
child_process.exec 使用子进程执行命令,缓存子进程的输出,并将子进程的输出以回调函数参数的形式返回。
语法:
child_process.exec(command[, options], callback)
参数
command: 字符串,将要运行的命令,参数使用空格隔开
options: 对象,可以是:
1. cwd - 字符串,子进程的当前工作目录
2. env - 对象,环境变量键值对
3. encoding - 字符串,字符编码( 默认: 'utf8')
4. shell - 字符串,将要执行命令的Shell( 默认:在UNIX 为/bin/sh, 在Windows中为cmd.exe,Shell 应当识别-c开关在UNIX中,或/s /c 在Windows中。在Windows中,命令行解析应当能兼容cmd.exe)
5. timeout - 数字,超时时间(默认:0)
6. maxBuffer - 数字,在stdout 或 stderr中允许存在的最大缓冲(二进制),如果超出,那么子进程将会被杀死(默认:200*1024)
7. killSignal - 字符串,结束信号(默认:‘SIGTERM’)
8. uid - 数字,设置用户进程的ID
9. gid - 数字,设置进程组的ID
callback: 回调函数,包含三个参数error, stdout 和 stderr
exec() 方法返回最大的缓冲区, 并等待进程结束,一次性返回缓冲区的内容。
五、实例
1.让我们创建两个js文件 support.js 和 master.js
support.js如下:
master.js如下:
执行结果:
似乎并没有那么顺利。
稍作修改的地方为:
需要保留一个 空格。
2. spawn() 方法
child_process.spawn 使用指定的命令行参数创建新进程,语法:
child_process.spawn(command[, args][, options])
参数说明如下:
command: 将要运行的命令
args: Array字符串参数数组
options Object
1. cwd String 子进程的当前工作目录
2. env Object环境变量键值对
3. stdio ArrayString 子进程的stdio配置
4. detached Boolean 这个子进程将会编程进程组的领导
5. uid Number 配置用户进程的ID
6. gid Number 配置进程组的ID
spawn()方法返回流(stdout & stderr), 在进程返回大量数据时使用。进程一旦开始执行时 spawn()就开始接收响应。
实例:
我们创建两个js,support1.js 和master1.js
执行结果:
fork方法:
child_process.fork 是spawn()方法的特殊形式,用于创建进程,语法格式如下:
child_process.fork(modulePath[, args][, options])
参数说明如下:
modualPath - String,将要在子进程中运行的模块
args - Array 字符串参数数组
options - Object
1. cwd String 子进程的当前工作目录
2. env Object 环境变量键值对
3. execPath String 创建子进程的可执行文件
4. execArgv Array 子进程的可执行文件的字符串参数数组(默认: process.execArgv)
5. silent Boolean 如果为true, 子进程的stdin, stdout 和 stderr将会被关联至父进程,否则,他们将会从父进程中继承。(默认为:false)
6. uid Number 设置用户进程的ID
7. gid Number 设置进程组的ID
返回的对象除了拥有ChildProcess实例的所有方法,还有一个内建的通信信道。
实例:
创建两个js, support2.js, master2.js
support2.js如下:
master2.js
执行结果: