利用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 相关文章推荐
js实现的网站首页随机公告随机公告
Mar 14 Javascript
读jQuery之十一 添加事件核心方法
Jul 31 Javascript
jquery jqPlot API 中文使用教程(非常强大的图表工具)
Aug 15 Javascript
jQuery+slidereveal实现的面板滑动侧边展出效果
Mar 14 Javascript
判断是否存在子节点的实现代码
May 18 Javascript
JavaScript基于原型链的继承
Jun 22 Javascript
新入门node.js必须要知道的概念(必看篇)
Aug 10 Javascript
微信小程序wx.getImageInfo()如何获取图片信息
Jan 26 Javascript
详解vue2.0监听属性的使用心得及搭配计算属性的使用
Jul 18 Javascript
vue中使用[provide/inject]实现页面reload的方法
Sep 30 Javascript
vue实现的多页面项目如何优化打包的步骤详解
Jul 19 Javascript
JS setTimeout与setInterval的区别
Apr 20 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实现操作redis的封装类完整实例
2015/11/14 PHP
非常经典的PHP文件上传类分享
2016/05/15 PHP
php获取微信共享收货地址的方法
2017/12/21 PHP
php web环境和命令行环境下查找php.ini的位置
2019/07/17 PHP
PHP单文件上传原理及上传函数的封装操作示例
2019/09/02 PHP
extjs grid设置某列背景颜色和字体颜色的方法
2010/09/03 Javascript
jquery延迟加载外部js实现代码
2013/01/11 Javascript
jQuery中toggleClass()方法用法实例
2015/01/05 Javascript
JavaScript将数字转换成大写中文的方法
2015/03/23 Javascript
jquery实现的用户注册表单提示操作效果代码分享
2015/08/28 Javascript
jQuery中的siblings用法实例分析
2015/12/24 Javascript
javascript实现标签切换代码示例
2016/05/22 Javascript
基于jQuery和Bootstrap框架实现仿知乎前端动态列表效果
2016/11/09 Javascript
BootStrap Table对前台页面表格的支持实例讲解
2016/12/22 Javascript
JavaScript实现经典排序算法之冒泡排序
2016/12/28 Javascript
AngularJs表单校验功能实例代码
2017/02/09 Javascript
jQuery实现简单的手风琴效果
2020/04/17 jQuery
VsCode里的Vue模板的实现
2020/08/12 Javascript
[00:36]DOTA2上海特级锦标赛 Alliance战队宣传片
2016/03/04 DOTA
Python实现控制台进度条功能
2016/01/04 Python
利用Python抓取行政区划码的方法
2016/11/28 Python
Python使用matplotlib简单绘图示例
2018/02/01 Python
python tkinter控件布局项目实例
2019/11/04 Python
Python3 hashlib密码散列算法原理详解
2020/03/30 Python
jupyter notebook 恢复误删单元格或者历史代码的实现
2020/04/17 Python
美国宠物商店:Wag.com
2016/10/25 全球购物
会计助理岗位职责
2014/02/17 职场文书
车辆转让协议书
2014/04/15 职场文书
资助贫困学生倡议书
2014/05/16 职场文书
2015年扫黄打非工作总结
2015/05/13 职场文书
保外就医申请书范文
2015/08/06 职场文书
宝宝满月祝酒词
2015/08/10 职场文书
古诗之爱国古诗5首
2019/09/20 职场文书
OpenCV绘制圆端矩形的示例代码
2021/08/30 Python
关于Python使用turtle库画任意图的问题
2022/04/01 Python
解决Python保存文件名太长OSError: [Errno 36] File name too long
2022/05/11 Python