利用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 相关文章推荐
JS面向对象编程浅析
Aug 28 Javascript
jQuery EasyUI API 中文文档 - NumberSpinner数值微调器使用介绍
Oct 21 Javascript
Node.js开发指南中的简单实例(mysql版)
Sep 17 Javascript
javascript读取Xml文件做一个二级联动菜单示例
Mar 17 Javascript
js实现网页右上角滑出会自动消失大幅广告的方法
Feb 27 Javascript
老生常谈onBlur事件与onfocus事件(js)
Jul 09 Javascript
微信小程序使用form表单获取输入框数据的实例代码
May 17 Javascript
jQuery实现的卷帘门滑入滑出效果【案例】
Feb 18 jQuery
详解用场景去理解函数柯里化(入门篇)
Apr 11 Javascript
javascrpt密码强度校验函数详解
Mar 18 Javascript
vue使用keep-alive实现组件切换时保存原组件数据方法
Oct 30 Javascript
React配置子路由的实现
Jun 03 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
文件系统基本操作类
2006/11/23 PHP
PHP设计模式之结构模式的深入解析
2013/06/13 PHP
windwos下使用php连接oracle数据库的过程分享
2014/05/26 PHP
PHP实现的简单留言板功能示例【基于thinkPHP框架】
2018/12/07 PHP
php+laravel依赖注入知识点总结
2019/11/04 PHP
精心挑选的12款优秀的基于jQuery的手风琴效果插件和教程
2012/08/22 Javascript
jQuery筛选器children()案例详解(图文)
2013/02/17 Javascript
js 显示base64编码的二进制流网页图片
2014/04/04 Javascript
iframe调用父页面函数示例详解
2014/07/17 Javascript
基于javascript实现判断移动终端浏览器版本信息
2014/12/09 Javascript
javascript文本框内输入文字倒计数的方法
2015/02/24 Javascript
基于Vue2的移动端开发环境搭建详解
2016/11/03 Javascript
Vue组件开发初探
2017/02/14 Javascript
基于Two.js实现星球环绕动画效果的示例
2017/11/06 Javascript
详解vue-cli之webpack3构建全面提速优化
2017/12/25 Javascript
node跨域转发 express+http-proxy-middleware的使用
2018/05/31 Javascript
maptalks+three.js+vue webpack实现二维地图上贴三维模型操作
2020/08/10 Javascript
JavaScript实现切换多张图片
2021/01/27 Javascript
利用Python学习RabbitMQ消息队列
2015/11/30 Python
使用Python更换外网IP的方法
2018/07/09 Python
对Python信号处理模块signal详解
2019/01/09 Python
python pandas获取csv指定行 列的操作方法
2019/07/12 Python
python配置文件写入过程详解
2019/10/19 Python
python实现逢七拍腿小游戏的思路详解
2020/05/26 Python
python文件排序的方法总结
2020/09/13 Python
分享30个新鲜的CSS3打造的精美绚丽效果(附演示下载)
2012/12/28 HTML / CSS
澳大利亚第一的设计师礼服租赁网站:GlamCorner
2017/08/13 全球购物
雷朋巴西官方商店:Ray-Ban Brasil
2020/07/21 全球购物
企业宣传工作方案
2014/06/02 职场文书
导航工程专业自荐信
2014/09/02 职场文书
2014年扶贫工作总结
2014/11/18 职场文书
结婚通知短信大全
2015/04/17 职场文书
2016年优秀少先队员事迹材料
2016/02/26 职场文书
vue 把二维或多维数组转一维数组
2022/04/24 Vue.js
详解Mysql数据库平滑扩容解决高并发和大数据量问题
2022/05/25 MySQL
纯CSS实现一个简单步骤条的示例代码
2022/07/15 HTML / CSS