利用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 chosen动态设置值实例介绍
Aug 08 Javascript
javaScript 页面自动加载事件详解
Feb 10 Javascript
Angular懒加载机制刷新后无法回退的快速解决方法
Aug 30 Javascript
JavaScript循环_动力节点Java学院整理
Jun 28 Javascript
用vue封装插件并发布到npm的方法步骤
Oct 18 Javascript
详解jQuery-each()方法
Mar 13 jQuery
vue百度地图 + 定位的详解
May 13 Javascript
angular多语言配置详解
May 16 Javascript
layui文件上传控件带更改后数据传值的方法
Sep 23 Javascript
微信小程序实现底部弹出框
Nov 18 Javascript
vue使用vue-quill-editor富文本编辑器且将图片上传到服务器的功能
Jan 13 Vue.js
js 实现Material UI点击涟漪效果示例
Sep 23 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
ThinkPHP模板之变量输出、自定义函数与判断语句用法
2014/11/01 PHP
PHP永久登录、记住我功能实现方法和安全做法
2015/04/27 PHP
PHP中抽象类,接口功能、定义方法示例
2019/02/26 PHP
js跑步算法的实现代码
2013/12/04 Javascript
jQuery设置指定网页元素宽度和高度的方法
2015/03/25 Javascript
jQuery form插件之formDdata参数校验表单及验证后提交
2016/01/23 Javascript
js实现精确到秒的日期选择器完整实例
2016/04/30 Javascript
jQuery Password Validation密码验证
2016/12/30 Javascript
Vue2递归组件实现树形菜单
2017/04/10 Javascript
vue 路由嵌套高亮问题的解决方法
2018/05/17 Javascript
Vue-不允许嵌套式的渲染方法
2018/09/13 Javascript
python用reduce和map把字符串转为数字的方法
2016/12/19 Python
Python中.py文件打包成exe可执行文件详解
2017/03/22 Python
让Python更加充分的使用Sqlite3
2017/12/11 Python
python脚本生成caffe train_list.txt的方法
2018/04/27 Python
从DataFrame中提取出Series或DataFrame对象的方法
2018/11/10 Python
Python自定义一个类实现字典dict功能的方法
2019/01/19 Python
PyQt5+requests实现车票查询工具
2019/01/21 Python
详细介绍Python进度条tqdm的使用
2019/07/31 Python
python爬虫中多线程的使用详解
2019/09/23 Python
Python 面向对象之类class和对象基本用法示例
2020/02/02 Python
python实现将两个文件夹合并至另一个文件夹(制作数据集)
2020/04/03 Python
Python+Kepler.gl轻松制作酷炫路径动画的实现示例
2020/06/02 Python
推荐一些比较有用的css3新属性
2014/11/11 HTML / CSS
纯css3实现宠物小鸡实例代码
2018/10/08 HTML / CSS
基于 HTML5 Canvas实现 的交互式地铁线路图
2018/03/05 HTML / CSS
HTML5 Canvas 实现圆形进度条并显示数字百分比效果示例
2017/08/18 HTML / CSS
世界上最大的曲棍球商店:Pro Hockey Life
2017/10/30 全球购物
Clarria化妆品官方网站:购买天然和有机化妆品系列
2018/04/08 全球购物
介绍一下ICMP(Internet Control Message Protocol)Internet控制信息协议
2016/11/26 面试题
餐饮采购员岗位职责
2014/03/15 职场文书
工作收入住址证明
2014/10/28 职场文书
幼师小班个人总结
2015/02/12 职场文书
运动会闭幕式主持词
2015/07/01 职场文书
解决Maven项目中 Invalid bound statement 无效的绑定问题
2021/06/15 Java/Android
i7 6700处理器相当于i5几代
2022/04/19 数码科技