利用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 相关文章推荐
Extjs4 关于Store的一些操作(加载/回调/添加)
Apr 18 Javascript
AngularJS整合Springmvc、Spring、Mybatis搭建开发环境
Feb 25 Javascript
javascript将中国数字格式转换成欧式数字格式的简单实例
Aug 02 Javascript
微信小程序开发之大转盘 仿天猫超市抽奖实例
Dec 08 Javascript
详谈jQuery中使用attr(), prop(), val()获取value的异同
Apr 25 jQuery
详解Angular2中Input和Output用法及示例
May 21 Javascript
一个简易时钟效果js实现代码
Mar 25 Javascript
jQuery除指定区域外点击任何地方隐藏DIV功能
Nov 13 jQuery
Bootstrap Table中的多选框删除功能
Jul 15 Javascript
微信小程序http连接访问解决方案的示例
Nov 05 Javascript
微信小程序实现商品属性联动选择
Feb 15 Javascript
从0到1构建vueSSR项目之node以及vue-cli3的配置
Mar 07 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
MongoDB在PHP中的常用操作小结
2014/02/20 PHP
phpQuery采集网页实现代码实例
2020/04/02 PHP
jQuery live
2009/05/15 Javascript
JavaScript Array扩展实现代码
2009/10/14 Javascript
用JS控制回车事件的代码
2011/02/20 Javascript
javascript Event对象详解及使用示例
2013/11/22 Javascript
new Date()问题在ie8下面的处理方法
2014/07/31 Javascript
Angular中$compile源码分析
2016/01/28 Javascript
JavaScript几种数组去掉重复值的方法推荐
2016/04/12 Javascript
Bootstrap BootstrapDialog使用详解
2017/02/17 Javascript
vue计算属性computed的使用方法示例
2019/03/13 Javascript
vue实现Excel文件的上传与下载功能的两种方式
2019/06/28 Javascript
vue登录页面cookie的使用及页面跳转代码
2019/07/10 Javascript
[01:33]PWL开团时刻DAY2-开雾与反开雾
2020/10/31 DOTA
Pyramid Mako模板引入helper对象的步骤方法
2013/11/27 Python
python执行外部程序的常用方法小结
2015/03/21 Python
简单介绍Python的Tornado框架中的协程异步实现原理
2015/04/23 Python
python基于xmlrpc实现二进制文件传输的方法
2015/06/02 Python
python用户管理系统
2018/03/13 Python
numpy使用fromstring创建矩阵的实例
2018/06/15 Python
Python读取数据集并消除数据中的空行方法
2018/07/12 Python
Python字符串逆序输出的实例讲解
2019/02/16 Python
python之pexpect实现自动交互的例子
2019/07/25 Python
Django mysqlclient安装和使用详解
2020/09/17 Python
Python入门基础之数字字符串与列表
2021/02/01 Python
CSS3伪类选择器:nth-child()
2009/04/02 HTML / CSS
几个MySql的面试题
2013/04/22 面试题
汽车专业大学生职业生涯规划范文
2014/01/07 职场文书
高一历史教学反思
2014/01/13 职场文书
技能比赛获奖感言
2014/02/14 职场文书
中学生操行评语
2014/04/24 职场文书
最新优秀教师个人先进事迹材料
2014/05/06 职场文书
2014年班级工作总结范文
2014/12/23 职场文书
班主任自我评价范文
2015/03/11 职场文书
小区物业管理2015年度工作总结
2015/10/22 职场文书
Android中View.post和Handler.post的关系
2022/06/05 Java/Android