Node.js 第十九章- 多进程

一、我们都知道 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

 

 

执行结果:

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值