nodejs基础之多进程实例详解


Posted in NodeJs onDecember 27, 2018

本文实例讲述了nodejs基础之多进程。分享给大家供大家参考,具体如下:

Node.js 多进程

我们都知道 Node.js 是以单线程的模式运行的,但它使用的是事件驱动来处理并发,这样有助于我们在多核 cpu 的系统上创建多个子进程,从而提高性能。

每个子进程总是带有三个流对象:child.stdin, child.stdoutchild.stderr。他们可能会共享父进程的 stdio 流,或者也可以是独立的被导流的流对象。

Node 提供了 child_process 模块来创建子进程,方法有:

  • exec - child_process.exec 使用子进程执行命令,缓存子进程的输出,并将子进程的输出以回调函数参数的形式返回。
  • spawn - child_process.spawn 使用指定的命令行参数创建新线程。
  • 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 :对象,可以是:

  • cwd ,字符串,子进程的当前工作目录
  • env,对象 环境变量键值对
  • encoding ,字符串,字符编码(默认: 'utf8')
  • shell ,字符串,将要执行命令的 Shell(默认: 在 UNIX 中为/bin/sh, 在 Windows 中为cmd.exe, Shell 应当能识别 -c开关在 UNIX 中,或 /s /c 在 Windows 中。 在Windows 中,命令行解析应当能兼容cmd.exe)
  • timeout,数字,超时时间(默认: 0)
  • maxBuffer,数字, 在 stdout 或 stderr 中允许存在的最大缓冲(二进制),如果超出那么子进程将会被杀死 (默认: 200*1024)
  • killSignal ,字符串,结束信号(默认:'SIGTERM')
  • uid,数字,设置用户进程的 ID
  • gid,数字,设置进程组的 ID

callback :回调函数,包含三个参数error, stdout 和 stderr。

exec() 方法返回最大的缓冲区,并等待进程结束,一次性返回缓冲区的内容。

实例

让我们创建两个 js 文件 support.js 和 master.js。

support.js 文件代码:

console.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.exec('node support.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);
  });
}

执行以上代码,输出结果为:

$ node master.js
子进程已退出,退出码 0
stdout: 进程 1 执行。
stderr:
子进程已退出,退出码 0
stdout: 进程 0 执行。
stderr:
子进程已退出,退出码 0
stdout: 进程 2 执行。
stderr:

spawn() 方法

child_process.spawn 使用指定的命令行参数创建新线程,语法格式如下:

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

spawn() 方法返回流 (stdout & stderr),在进程返回大量数据时使用。进程一旦开始执行时 spawn() 就开始接收响应。

实例

让我们创建两个 js 文件 support.js 和 master.js。

support.js 文件代码:

console.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', ['support.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);
  });
}

执行以上代码,输出结果为:

$ node master.js stdout: 进程 0 执行。
子进程已退出,退出码 0
stdout: 进程 1 执行。
子进程已退出,退出码 0
stdout: 进程 2 执行。
子进程已退出,退出码 0

fork 方法

child_process.forkspawn() 方法的特殊形式,用于创建进程,语法格式如下:

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

返回的对象除了拥有ChildProcess实例的所有方法,还有一个内建的通信信道。

h3>实例

让我们创建两个 js 文件 support.js 和 master.js。

support.js 文件代码:

console.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("support.js", [i]);
  worker_process.on('close', function (code) {
   console.log('子进程已退出,退出码 ' + code);
  });
}

执行以上代码,输出结果为:

$ node master.js
进程 0 执行。
子进程已退出,退出码 0
进程 1 执行。
子进程已退出,退出码 0
进程 2 执行。
子进程已退出,退出码 0

希望本文所述对大家nodejs程序设计有所帮助。

NodeJs 相关文章推荐
nodejs读取memcache示例分享
Jan 02 NodeJs
基于promise.js实现nodejs的promises库
Jul 06 NodeJs
Windows系统中安装nodejs图文教程
Feb 28 NodeJs
ubuntu下安装nodejs以及升级的办法
May 08 NodeJs
NodeJS实现阿里大鱼短信通知发送
Jan 17 NodeJs
NodeJS学习笔记之Module的简介
Mar 24 NodeJs
深入nodejs中流(stream)的理解
Mar 27 NodeJs
nodejs个人博客开发第七步 后台登陆
Apr 12 NodeJs
nodejs操作mysql实现增删改查的实例
May 28 NodeJs
NodeJS实现图片上传代码(Express)
Jun 30 NodeJs
nodejs判断文件、文件夹是否存在及删除的方法
Nov 10 NodeJs
深入理解nodejs搭建静态服务器(实现命令行)
Feb 05 NodeJs
nodejs基础之常用工具模块util用法分析
Dec 26 #NodeJs
nodejs基础之buffer缓冲区用法分析
Dec 26 #NodeJs
nodejs异步编程基础之回调函数用法分析
Dec 26 #NodeJs
Nodejs处理异常操作示例
Dec 25 #NodeJs
Nodejs模块的调用操作实例分析
Dec 25 #NodeJs
nodejs中方法和模块用法示例
Dec 24 #NodeJs
Nodejs中获取当前函数被调用的行数及文件名详解
Dec 12 #NodeJs
You might like
PHP统计目录下的文件总数及代码行数(去除注释及空行)
2011/01/17 PHP
PHP+redis实现的购物车单例类示例
2019/02/02 PHP
js 图片轮播(5张图片)
2008/12/30 Javascript
javascript HTMLEncode HTMLDecode的完整实例(兼容ie和火狐)
2009/06/02 Javascript
通过JS 获取Mouse Position(鼠标坐标)的代码
2009/09/21 Javascript
Jquery创建一个层当鼠标移动到层上面不消失效果
2013/12/12 Javascript
用js格式化金额可设置保留的小数位数
2014/05/09 Javascript
js实现的类似于asp数据字典的数据类型代码实例
2014/09/03 Javascript
jQuery中wrapAll()方法用法实例
2015/01/16 Javascript
基于JS实现类似支付宝支付密码输入框
2016/09/02 Javascript
Vue中添加过渡效果的方法
2017/03/16 Javascript
jQuery实现点击关注和取消功能
2017/07/03 jQuery
Node.js调用fs.renameSync报错(Error: EXDEV, cross-device link not permitted)
2017/12/27 Javascript
layui 设置table 行的高度方法
2018/08/17 Javascript
vue使用rem实现 移动端屏幕适配
2018/09/26 Javascript
解决jquery validate 验证不通过后验证正确的信息仍残留在label上的方法
2019/08/27 jQuery
封装一下vue中的axios示例代码详解
2020/02/16 Javascript
原生js生成图片验证码
2020/10/11 Javascript
Vant 中的Toast设置全局的延迟时间操作
2020/11/04 Javascript
Python的Django框架中的URL配置与松耦合
2015/07/15 Python
python 基础教程之Map使用方法
2017/01/17 Python
Android基于TCP和URL协议的网络编程示例【附demo源码下载】
2018/01/23 Python
Python数据分析之获取双色球历史信息的方法示例
2018/02/03 Python
Python测试人员需要掌握的知识
2018/02/08 Python
Python实现的购物车功能示例
2018/02/11 Python
让Django的BooleanField支持字符串形式的输入方式
2020/05/20 Python
基于Python爬取京东双十一商品价格曲线
2020/10/23 Python
WatchShop法国:英国排名第一的独立手表零售商
2020/02/17 全球购物
国际贸易专业推荐信
2013/11/15 职场文书
编辑找工作求职信范文
2013/12/16 职场文书
基层党员对照检查材料
2014/08/25 职场文书
社区党员公开承诺书
2014/08/30 职场文书
机关单位工作失职检讨书
2014/11/20 职场文书
2014年卫生工作总结
2014/11/27 职场文书
初中教务主任竞聘演讲稿(范文)
2019/08/20 职场文书
Python实现视频中添加音频工具详解
2021/12/06 Python