利用node.js如何创建子进程详解


Posted in Javascript onDecember 09, 2017

前言

node本身为单进程,并使用驱动模式处理并发,为了解决单进程在多核cpu上的资源浪费,node提供了cluster和child_process模块来创建多个子进程。

Node.js是单线程的,对于现在普遍是多处理器的机器是一种浪费,怎么能利用起来呢?于是child_process模块出现了。child_process模块可以在其他进程上产生、派生,并执行工作。

child_process模块提供了一个ChildProcess的新类,它可以作为从父进程访问子进程的表示形式。Process模块也是ChildProcess对象。当你从父模块访问process时,它是父ChildProcess对象,当你从子进程访问Process是,它是ChildProcess对象

了解一个对象无外乎事件、方法、属性。ChildProcess也是一样。

每个子进程总带有三个流对象:child.stdin、child.stdout、child.stderr。他们可能会共享父进程的stdio流。

这里我们先介绍利用child_process模块中exec、spawn、fork三个方法对子进程的操作。

建立node-childProcess文件,在其中创建node-childPro.js文件。

其中就一行代码如下:

console.log("进程 " + process.argv[2] + " 执行。" );
//换成下面的查看process.argv
//console.log("进程 " + process.argv + " 执行。" );

exec()方法

在node-childProcess文件中新建node-childPro-exec.js文件,其中代码如下:

const fs = require('fs');
const child_process = require('child_process');
for (var i = 0; i < 3; i++) {
 //这里有空格请注意。分别代表node路径 node-childPro.js路径 i第几个进程。 node-childPro.js中的process.argv可以获取这些信息值
 var childProcess = child_process.exec('node node-childPro.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);
 });
 childProcess.on('exit', function (code) {
 console.log('子进程已退出,退出码 ' + code);
 });
}

终端执行代码结果如下:

G:\node\node-childProcess> node node-childPro-exec.js
子进程已退出,退出码 0
stdout: 进程 0 执行。
stderr:
子进程已退出,退出码 0
stdout: 进程 1 执行。
stderr:
子进程已退出,退出码 0
stdout: 进程 2 执行。
stderr:

spawn()方法

在node-childProcess文件中新建node-childPro-spawn.js,其中代码如下:

const fs = require('fs');
const child_process = require('child_process');
 for(var i=0; i<3; i++) {
 var childProcess = child_process.spawn('node', ['node-childPro-spawn.js', i]);  
 childProcess.stdout.on('data', function (data) {
 console.log('stdout: ' + data);
 });
childProcess.stderr.on('data', function (data) {
 console.log('stderr: ' + data);
 });
 childProcess.on('close', function (code) {
 console.log('子进程已退出,退出码 '+code);
 });
}

终端执行代码结果如下:

G:\node\node-childProcess> node node-childPro-spawn.js
stdout: 进程 0 执行。
子进程已退出,退出码 0
stdout: 进程 1 执行。
stdout: 进程 2 执行。
子进程已退出,退出码 0
子进程已退出,退出码 0

fork()方法

在node-childProcess文件中新建node-childPro-fork.js,其中代码如下:

const fs = require('fs');
const child_process = require('child_process');
 for(var i=0; i<3; i++) {
 var childProcess = child_process.fork("node-childPro.js", [i]); 
 childProcess.on('close', function (code) {
 console.log('子进程已退出,退出码 ' + code);
 });
}

终端执行代码结果如下:

G:\node\node-childProcess> node node-childPro-fork.js
进程 0 执行。
进程 1 执行。
子进程已退出,退出码 0
进程 2 执行。
子进程已退出,退出码 0
子进程已退出,退出码 0

关于exec、spawn、fork

     1.exec函数是对spawn的一种友好封装,增加Shell命令解析,可以直接嵌入复杂的命令

     2.exec函数缓存子进程的输出,并将子进程的输出以回调函数参数的形式返回

     3.spawn在子线程开始执行后,就开始不断将数据从子进程返回给主进程(应用场景如“系统监控”)

     4.spawn是不支持callback函数的,它通过流的方式发数据传给主进程,从而实现了多进程之间的数据交换

     5.fork()是spawn()的特殊情景,用于派生Node进程。除了普通ChildProcess实例所具有的所有方法,所返回的对象还具有内建的通讯通道。

下载地址:https://gitee.com/wangFengJ/node/tree/master/node-childProcess

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。

Javascript 相关文章推荐
javascript radio 联动效果
Mar 04 Javascript
JS 控制非法字符的输入代码
Dec 04 Javascript
jquery实现marquee效果(文字或者图片的水平垂直滚动)
Jan 07 Javascript
倒记时60刷新网页的js代码
Feb 18 Javascript
学习JavaScript设计模式(封装)
Nov 26 Javascript
angularJs使用$watch和$filter过滤器制作搜索筛选实例
Jun 01 Javascript
JS判断Android、iOS或浏览器的多种方法(四种方法)
Jun 29 Javascript
vue+element-ui集成随机验证码+用户名+密码的form表单验证功能
Aug 05 Javascript
PostgreSQL Node.js实现函数计算方法示例
Feb 12 Javascript
基于node+vue实现简单的WebSocket聊天功能
Feb 01 Javascript
微信小程序复选框实现多选一功能过程解析
Feb 14 Javascript
JavaScript实例 ODO List分析
Jan 22 Javascript
微信小程序使用slider设置数据值及switch开关组件功能【附源码下载】
Dec 09 #Javascript
微信小程序实现action-sheet弹出底部菜单功能【附源码下载】
Dec 09 #Javascript
微信小程序使用toast消息对话框提示用户忘记输入用户名或密码功能【附源码下载】
Dec 09 #Javascript
微信小程序loading组件显示载入动画用法示例【附源码下载】
Dec 09 #Javascript
Angular中点击li标签实现更改颜色的核心代码
Dec 08 #Javascript
Javascript中的作用域及块级作用域
Dec 08 #Javascript
Vue中自定义全局组件的实现方法
Dec 08 #Javascript
You might like
php数组函数序列之array_flip() 将数组键名与值对调
2011/11/07 PHP
php中get_headers函数的作用及用法的详细介绍
2013/04/27 PHP
PHP自定义图片缩放函数实现等比例不失真缩放的方法
2016/08/19 PHP
详解Yii2高级版引入bootstrap.js的一个办法
2017/03/21 PHP
Yii2框架中使用PHPExcel导出Excel文件的示例
2017/08/09 PHP
Jquery+JSon 无刷新分页实现代码
2010/04/01 Javascript
基于jquery的页面划词搜索JS
2010/09/14 Javascript
jquery 与NVelocity 产生冲突的解决方法
2011/06/13 Javascript
Javascript保存网页为图片借助于html2canvas库实现
2014/09/05 Javascript
不得不分享的JavaScript常用方法函数集(下)
2015/12/25 Javascript
JS调用某段SQL语句的方法
2016/10/20 Javascript
浅谈Node.js:理解stream
2016/12/08 Javascript
javascript-解决mongoose数据查询的异步操作
2016/12/22 Javascript
微信小程序 石头剪刀布实例代码
2017/01/04 Javascript
详解使用vue脚手架工具搭建vue-webpack项目
2017/05/10 Javascript
Angular.js ng-file-upload结合springMVC的使用教程
2017/07/10 Javascript
微信小程序-form表单提交代码实例
2019/04/29 Javascript
Node绑定全局TraceID的实现方法
2019/11/14 Javascript
python代码制作configure文件示例
2014/07/28 Python
Python实现短网址ShortUrl的Hash运算实例讲解
2015/08/10 Python
Python 由字符串函数名得到对应的函数(实例讲解)
2017/08/10 Python
Python中xrange与yield的用法实例分析
2017/12/26 Python
python2.7安装图文教程
2018/03/13 Python
在pycharm 中添加运行参数的操作方法
2019/01/19 Python
Python查找最长不包含重复字符的子字符串算法示例
2019/02/13 Python
Python字典添加,删除,查询等相关操作方法详解
2020/02/07 Python
使用SQLAlchemy操作数据库表过程解析
2020/06/10 Python
Python安装Bs4的多种方法
2020/11/28 Python
BannerBuzz加拿大:在线定制横幅印刷、广告和标志
2020/03/10 全球购物
伊莱克斯(Electrolux)俄罗斯网上商店:瑞典家用电器品牌
2021/01/23 全球购物
会计学自荐信
2014/06/03 职场文书
2014年网络管理员工作总结
2014/12/01 职场文书
2015年五四青年节演讲稿
2015/03/18 职场文书
行政复议答复书
2015/07/01 职场文书
防溺水主题班会教案
2015/08/12 职场文书
微软Win11有哪些隐藏功能? windows11多个功能汇总
2021/11/21 数码科技