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学习item【入门手上】
May 05 NodeJs
浅谈Nodejs中的作用域问题
Dec 26 NodeJs
nodejs个人博客开发第四步 数据模型
Apr 12 NodeJs
深入浅析Nodejs的Http模块
Jun 20 NodeJs
nodejs实现爬取网站图片功能
Dec 14 NodeJs
基于nodejs实现微信支付功能
Dec 20 NodeJs
nodejs简单实现TCP服务器端和客户端的聊天功能示例
Jan 04 NodeJs
nodejs acl的用户权限管理详解
Mar 14 NodeJs
nodejs实现解析xml字符串为对象的方法示例
Mar 14 NodeJs
nodejs高大上的部署方式(PM2)
Sep 11 NodeJs
NodeJS使用Range请求实现下载功能的方法示例
Oct 12 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包含文件函数include、include_once、require、require_once区别总结
2014/04/05 PHP
PHP中仿制 ecshop验证码实例
2017/01/06 PHP
PHP 自动加载类原理与用法实例分析
2020/04/14 PHP
JQuery 插件模板 制作jquery插件的朋友可以参考下
2010/03/17 Javascript
js图片自动轮播代码分享(js图片轮播)
2014/05/06 Javascript
nodejs的10个性能优化技巧
2014/07/15 NodeJs
JS获取浏览器语言动态加载JS文件示例代码
2014/10/31 Javascript
详解JavaScript中shift()方法的使用
2015/06/09 Javascript
jquery ztree实现树的搜索功能
2016/02/25 Javascript
jQuery实现为LI列表前3行设置样式的方法【2种方法】
2016/09/04 Javascript
Angular ng-repeat 对象和数组遍历实例
2016/09/14 Javascript
Bootstrap基本样式学习笔记之标签(5)
2016/12/07 Javascript
ES6中class类用法实例浅析
2017/04/06 Javascript
Nodejs中Express 常用中间件 body-parser 实现解析
2017/05/22 NodeJs
Angular 4.x+Ionic3踩坑之Ionic3.x pop反向传值详解
2018/03/13 Javascript
element-ui循环显示radio控件信息的方法
2018/08/24 Javascript
浅谈vue后台管理系统权限控制思考与实践
2018/12/19 Javascript
详解vue中在循环中使用@mouseenter 和 @mouseleave事件闪烁问题解决方法
2020/04/07 Javascript
详解在IDEA中将Echarts引入web两种方式(使用js文件和maven的依赖导入)
2020/07/11 Javascript
[01:48]帕吉至宝加入游戏,遗迹战场现“千劫神屠”
2018/04/07 DOTA
Python3最长回文子串算法示例
2019/03/04 Python
python设计微型小说网站(基于Django+Bootstrap框架)
2019/07/08 Python
解析python的局部变量和全局变量
2019/08/15 Python
解决python 3 urllib 没有 urlencode 属性的问题
2019/08/22 Python
python协程gevent案例 爬取斗鱼图片过程解析
2019/08/27 Python
Python Pillow.Image 图像保存和参数选择方式
2020/01/09 Python
python 瀑布线指标编写实例
2020/06/03 Python
HTML5通过调用canvas对象的getContext()方法来获取绘图环境
2014/06/23 HTML / CSS
美国排名第一的在线葡萄酒商店:Wine.com
2016/09/07 全球购物
美国专营婴幼儿用品的购物网站:buybuy BABY
2017/01/01 全球购物
行政助理的岗位职责
2014/02/18 职场文书
安全生产管理责任书
2014/04/16 职场文书
2014年学生会生活部工作总结
2014/11/07 职场文书
小学新教师个人总结
2015/02/05 职场文书
小学教师暑期培训心得体会
2016/01/09 职场文书
云服务器部署 Web 项目的实现步骤
2022/06/28 Servers