利用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的执行顺序 之jQuery.html深度分析
Mar 03 Javascript
html+js实现动态显示本地时间
Sep 21 Javascript
JavaScript中的函数模式详解
Feb 11 Javascript
jQuery匹配文档链接并添加class的方法
Jun 26 Javascript
《JavaScript函数式编程》读后感
Aug 07 Javascript
javascript 用函数实现继承详解
May 28 Javascript
AngularJS模块详解及示例代码
Aug 17 Javascript
js 事件的传播机制(实例讲解)
Jul 20 Javascript
利用node.js+mongodb如何搭建一个简单登录注册的功能详解
Jul 30 Javascript
node.js学习之事件模块Events的使用示例
Sep 28 Javascript
React router动态加载组件之适配器模式的应用详解
Sep 12 Javascript
微信h5静默和非静默授权获取用户openId的方法和步骤
Jun 08 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中session退出登陆问题
2014/02/27 PHP
检测codeigniter脚本消耗内存情况的方法
2015/03/21 PHP
php实现格式化多行文本为Js可用格式
2015/04/15 PHP
PHP5.5基于mysqli连接MySQL数据库和读取数据操作实例详解
2019/02/16 PHP
PHP中str_split()函数的用法讲解
2019/04/11 PHP
Javascript图像处理思路及实现代码
2012/12/25 Javascript
微信小程序 详解Page中data数据操作和函数调用
2017/01/12 Javascript
node获取客户端ip功能简单示例
2019/08/24 Javascript
webpack.DefinePlugin与cross-env区别详解
2020/02/23 Javascript
JQuery事件冒泡和默认行为代码实例
2020/05/13 jQuery
JS组件库AlloyTouch实现图片轮播过程解析
2020/05/29 Javascript
[02:08]什么藏在DOTA2 TI9“小紫本”里?斧王历险记告诉你!
2019/05/17 DOTA
Python常用的文件及文件路径、目录操作方法汇总介绍
2015/05/21 Python
Python列表list解析操作示例【整数操作、字符操作、矩阵操作】
2017/07/25 Python
Python实现的直接插入排序算法示例
2018/04/29 Python
python使用turtle绘制分形树
2018/06/22 Python
Python中logging.NullHandler 的使用教程
2018/11/29 Python
python使用zip将list转为json的方法
2018/12/31 Python
OpenCV+face++实现实时人脸识别解锁功能
2019/08/28 Python
pycharm通过ssh连接远程服务器教程
2020/02/12 Python
Jupyter加载文件的实现方法
2020/04/14 Python
pandas apply多线程实现代码
2020/08/17 Python
Python接口自动化测试的实现
2020/08/28 Python
HTML5实现获取地理位置信息并定位功能
2015/04/25 HTML / CSS
JD Sports德国官网:英国领先的运动鞋和运动服饰零售商
2018/02/26 全球购物
美国最大的存储市场:SpareFoot
2018/07/23 全球购物
学校采购员岗位职责
2014/01/02 职场文书
2014党员学习《反腐倡廉警示教育读本》思想汇报
2014/09/13 职场文书
民主评议党员自我评议范文2014
2014/09/26 职场文书
党员民主生活会对照检查材料思想汇报
2014/09/28 职场文书
2014年内勤工作总结
2014/11/24 职场文书
老乡会致辞
2015/07/28 职场文书
《初涉尘世》读后感3篇
2020/01/10 职场文书
pytorch通过训练结果的复现设置随机种子
2021/06/01 Python
linux目录管理方法介绍
2022/06/01 Servers
Go语言编译原理之变量捕获
2022/08/05 Golang