利用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 相关文章推荐
用jquery模仿的a的title属性的例子
Oct 22 Javascript
javascript限制文本框输入值类型的方法
May 07 Javascript
JS选项卡动态替换banner图片路径的方法
May 11 Javascript
举例讲解jQuery中可见性过滤选择器的使用
Apr 18 Javascript
最全面的JS倒计时代码
Sep 17 Javascript
详谈for循环里面的break和continue语句
Jul 20 Javascript
利用javascript如何随机生成一定位数的密码
Sep 22 Javascript
JavaScript中正则表达式使数字、中文或指定字符高亮显示
Oct 31 Javascript
js时间戳与日期格式之间相互转换
Dec 11 Javascript
vue 实现数字滚动增加效果的实例代码
Jul 06 Javascript
JavaScript跳出循环的三种方法(break, return, continue)
Jul 30 Javascript
返回上一个url并刷新界面的js代码
Sep 12 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多图上传小程序代码
2011/07/17 PHP
老生常谈PHP面向对象之注册表模式
2017/05/26 PHP
PHP递归算法的简单实例
2019/02/28 PHP
php使用fputcsv实现大数据的导出操作详解
2020/02/27 PHP
JQuery 选择器、过滤器介绍
2011/02/14 Javascript
js querySelector和getElementById通过id获取元素的区别
2012/04/20 Javascript
JavaScript判断DOM何时加载完毕的技巧
2012/11/11 Javascript
js Select下拉列表框进行多选、移除、交换内容的具体实现方法
2013/08/13 Javascript
使用JavaScript实现旋转的彩圈特效
2015/06/23 Javascript
jquery实现点击弹出带标题栏的弹出层(从右上角飞入)效果
2015/09/19 Javascript
javascript实现获取浏览器版本、浏览器类型
2015/12/02 Javascript
Bootstrap3制作自己的导航栏
2016/05/12 Javascript
js无提示关闭浏览器窗口的两种方法分析
2016/11/06 Javascript
JS/HTML5游戏常用算法之路径搜索算法 A*寻路算法完整实例
2018/12/14 Javascript
Angular8路由守卫原理和使用方法
2019/08/29 Javascript
[01:22]DOTA2神秘商店携大量周边降临完美大师赛
2017/11/07 DOTA
python使用beautifulsoup从爱奇艺网抓取视频播放
2014/01/23 Python
Python中字典的基础知识归纳小结
2015/08/19 Python
Python 列表(List) 的三种遍历方法实例 详解
2017/04/15 Python
Python3.X 线程中信号量的使用方法示例
2017/07/24 Python
详谈套接字中SO_REUSEPORT和SO_REUSEADDR的区别
2018/04/28 Python
Python pygorithm模块用法示例【常见算法测试】
2018/08/16 Python
python实现贪吃蛇小游戏
2020/03/21 Python
python 发送json数据操作实例分析
2019/10/15 Python
浅析Django中关于session的使用
2019/12/30 Python
python图形界面开发之wxPython树控件使用方法详解
2020/02/24 Python
python GUI库图形界面开发之PyQt5中QMainWindow, QWidget以及QDialog的区别和选择
2020/02/26 Python
解决Python spyder显示不全df列和行的问题
2020/04/20 Python
python爬虫把url链接编码成gbk2312格式过程解析
2020/06/08 Python
opencv 图像加法与图像融合的实现代码
2020/07/08 Python
CSS3简单实现照片墙
2014/12/12 HTML / CSS
教师求职信
2014/06/17 职场文书
2014年体检中心工作总结
2014/12/23 职场文书
员工离职感谢信
2015/01/22 职场文书
《家世》读后感:看家训的力量
2019/12/30 职场文书
Python自然语言处理之切分算法详解
2021/04/25 Python