node.js学习日记——(8)
2017-02-09 22:16
281 查看
多进程
Node.js 是以单线程的模式运行的,但它使用的是事件驱动来处理并发,这样有助于在多核 cpu 的系统上创建多个子进程,从而提高性能。Node 提供了 child_process 模块来创建子进程.
exec() 方法
child_process.exec 使用子进程执行命令,缓存子进程的输出,并将子进程的输出以回调函数参数的形式返回。属于“同步中的异步”,即直到完全读取到内容,才会从子进程返回数据。child_process.exec(command[, options], callback)
command: 字符串, 将要运行的命令,参数使用空格隔开
options :对象,可以是:
cwd ,字符串,子进程的当前工作目录
encoding,字符串,字符编码(默认:’utf8’)
shell ,字符串,将要执行命令的 Shell(默认: 在 UNIX 中为/bin/sh,在 Windows 中为cmd.exe, Shell 应当能识别 -c开关在 UNIX 中,或 /s /c 在 Windows 中。
timeout,数字,超时时间(默认: 0)
maxBuffer,数字, 在stdout 或 stderr 中允许存在的最大缓冲(二进制),如果超出那么子进程将会被杀死 (默认: 200*1024)
killSignal ,字符串,结束信号(默认:’SIGTERM’)
uid,数字,设置用户进程的 ID
gid,数字,设置进程组的 ID
callback :回调函数,包含三个参数error, stdout 和 stderr。
举例
sub.jsconsole.log("进程 " + process.argv[2] + " 执行。" );
master.js
const fs = require('fs'); const child_process = require('child_process'); for(var i=0; i<3; i++) { //执行node命令,当前子进程目录为sub.js,用户进程id为当前的i,用空格隔开 //command与options各参数之间用空格分开,共同拼接成一个字符串 var workerProcess = child_process.exec('node sub.js '+i, function (error, stdout, stderr) { if (error) { console.log(error.stack); console.log('Error code: '+error.code); console.log('Signal received: '+error.signal); } console.log('stdout: ' + stdout); console.log('stderr: ' + stderr); }); workerProcess.on('exit', function (code) { console.log('子进程已退出,退出码 '+code); }); }
spawn() 方法
child_process.spawn 使用指定的命令行参数创建新进程。返回一个stream对象,因此当想要子进程返回大量数据时,例如图像处理,读取二进制数据等,最好使用此方法,此方法属于“异步中的异步”,这意味着从子进程开始执行开始,就开始有数据流从子进程传输给node。child_process.spawn(command[, args][, options])
command: 将要运行的命令
args: Array 字符串参数数组
options Object
cwd String 子进程的当前工作目录
env Object 环境变量键值对
stdio Array|String 子进程的 stdio 配置
detached Boolean 这个子进程将会变成进程组的领导
uid Number 设置用户进程的 ID
gid Number 设置进程组的 ID
举例
sub.jsconsole.log("进程 " + process.argv[2] + " 执行。" );
master.js
const fs = require('fs'); const child_process = require('child_process'); for(var i=0; i<3; i++) { var workerProcess = child_process.spawn('node', ['sub.js', i]); workerProcess.stdout.on('data', function (data) { console.log('stdout: ' + data); }); workerProcess.stderr.on('data', function (data) { console.log('stderr: ' + data); }); workerProcess.on('close', function (code) { console.log('子进程已退出,退出码 '+code); }); }
fork() 方法
spawn() 方法的特殊形式,不同之处就是它创建子进程只需要指定要执行的文件模块即可,返回的对象除了拥有ChildProcess实例的所有方法,还有一个内建的通信信道。child_process.fork(modulePath[, args][, options])
modulePath: String,将要在子进程中运行的模块
args: Array 字符串参数数组
options:Object
cwd String 子进程的当前工作目录
env Object 环境变量键值对
execPath String 创建子进程的可执行文件
execArgv Array 子进程的可执行文件的字符串参数数组(默认:process.execArgv)
silent Boolean 如果为true,子进程的stdin,stdout和stderr将会被关联至父进程,否则,它们将会从父进程中继承。(默认为:false)
uid Number 设置用户进程的 ID
gid Number 设置进程组的 ID
举例
sub.jsconsole.log("进程 " + process.argv[2] + " 执行。" );
master.js
const fs = require('fs'); const child_process = require('child_process'); for(var i=0; i<3; i++) { var worker_process = child_process.fork("sub.js", [i]); worker_process.on('close', function (code) { console.log('子进程已退出,退出码 ' + code); }); }
JXcore 打包
JXcore 是一个支持多线程的 Node.js 发行版本,基本不需要对现有的代码做任何改动就可以直接线程安全地以多线程运行。https://github.com/jxcore/jxcore
相关文章推荐
- Node.js-事件模块(events)之监听方式
- NPM、nodeJS安装,grunt自动化构建工具学习总结
- Nodejs心跳包(一)简易监控 --学习笔记
- Windows环境下使用Node.js
- CommonJS包规范与NodeJS的包管理工具NPM
- [原创.数据可视化系列之十二]使用 nodejs通过async await建立同步数据抓取
- node.js 版本升级
- nodejs介绍
- 我的nodeJs服务器迁移安装过程
- CommonJS模块规范与NodeJS的模块系统底层原理
- reeview的Node拖动,Node节点上下移动
- dom4j selectNodes报错
- 利用百度tts 实现文字转语音(node)
- node.js的安装
- Nodejs的单线程、异步IO与事件驱动
- nodejs+cheerio爬虫测试
- 【自】十天学会NodeJs的实战运用,express框架的应用(一)
- Node.js 添加 C-C++ Addon
- Nodejs 发送Post请求功能(发短信验证码例子)
- 理解Node.js的事件轮询