利用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实例教程(19) 使用HoTMetal(5)
Dec 23 Javascript
JS 密码强度验证(兼容IE,火狐,谷歌)
Mar 15 Javascript
使用node.js 制作网站前台后台
Nov 13 Javascript
jQuery mobile的header和footer在点击屏幕的时候消失的解决办法
Jul 01 Javascript
利用D3.js实现最简单的柱状图示例代码
Dec 09 Javascript
根据Bootstrap Paginator改写的js分页插件
Dec 25 Javascript
[jQuery] 事件和动画详解
Mar 05 jQuery
浅谈js中的bind
Mar 18 Javascript
vue cli使用融云实现聊天功能的实例代码
Apr 19 Javascript
vue filter 完美时间日期格式的代码
Aug 14 Javascript
Vue实现图片与文字混输效果
Dec 04 Javascript
vue使用wavesurfer.js解决音频可视化播放问题
Apr 04 Vue.js
微信小程序使用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跳转页面的几种实现方法详解
2013/06/08 PHP
动态表单验证的操作方法和TP框架里面的ajax表单验证
2017/07/19 PHP
JavaScrip单线程引擎工作原理分析
2010/09/04 Javascript
在Windows上安装Node.js模块的方法
2011/09/25 Javascript
JavaScript利用append添加元素报错的解决方法
2014/07/01 Javascript
JavaScript中变量声明有var和没var的区别示例介绍
2014/09/15 Javascript
js实现从数组里随机获取元素
2015/01/12 Javascript
jquery.map()方法的使用详解
2015/07/09 Javascript
javascript生成不重复的随机数
2015/07/17 Javascript
jQuery实现鼠标经过时出现隐藏层文字链接的方法
2015/10/12 Javascript
Bootstrap3 input输入框插入glyphicon图标的方法
2016/05/16 Javascript
ES6教程之for循环和Map,Set用法分析
2017/04/10 Javascript
微信小程序实现点击按钮修改view标签背景颜色功能示例【附demo源码下载】
2017/12/06 Javascript
Angular实现的自定义模糊查询、排序及三角箭头标注功能示例
2017/12/28 Javascript
jQuery实现tab栏切换效果
2020/12/22 jQuery
[01:04:29]DOTA2-DPC中国联赛 正赛 Phoenix vs XG BO3 第二场 1月31日
2021/03/11 DOTA
Python实现冒泡,插入,选择排序简单实例
2014/08/18 Python
Python实现模拟分割大文件及多线程处理的方法
2017/10/10 Python
Python使用matplotlib绘制余弦的散点图示例
2018/03/14 Python
mac下pycharm设置python版本的图文教程
2018/06/13 Python
python实现比较文件内容异同
2018/06/22 Python
Django在Model保存前记录日志实例
2020/05/14 Python
python 多线程中join()的作用
2020/10/29 Python
如何将Pycharm中调整字体大小的方式设置为&quot;ctrl+鼠标滚轮上下滑&quot;
2020/11/17 Python
使用Python爬取Json数据的示例代码
2020/12/07 Python
捷克汽车配件和工具销售网站:TorriaCars
2018/02/26 全球购物
澳大利亚女装精品店:Alannah Hill
2020/07/29 全球购物
华为c/c++笔试题
2016/01/25 面试题
Jdbc数据访问技术面试题
2012/03/30 面试题
网上书店创业计划书
2014/01/12 职场文书
学生打架检讨书
2014/02/14 职场文书
市场督导岗位职责
2015/04/10 职场文书
主持稿开场白
2015/06/01 职场文书
学校运动会开幕词
2016/03/03 职场文书
Java无向树分析 实现最小高度树
2022/04/09 Javascript
springboot 全局异常处理和统一响应对象的处理方式
2022/06/28 Java/Android