利用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 相关文章推荐
分页栏的web标准实现
Nov 01 Javascript
jquery插件validate验证的小例子
May 08 Javascript
jquery中ajax函数执行顺序问题之如何设置同步
Feb 28 Javascript
百度地图API之本地搜索与范围搜索
Jul 30 Javascript
在jQuery中处理XML数据的大致方法
Aug 14 Javascript
客户端验证用户名和密码的方法详解
Jun 16 Javascript
jQuery实现弹出窗口弹出div层的实例代码
Jan 09 Javascript
Angularjs自定义指令实现三级联动 选择地理位置
Feb 13 Javascript
ionic 3.0+ 项目搭建运行环境的教程
Aug 09 Javascript
js+css实现红包雨效果
Jul 12 Javascript
JS实现面向对象继承的5种方式分析
Jul 21 Javascript
Vue.js项目实战之多语种网站的功能实现(租车)
Aug 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
php加密解密函数authcode的用法详细解析
2013/10/28 PHP
php中通过DirectoryIterator删除整个目录的方法
2015/03/13 PHP
DEDE实现转跳属性文档在模板上调用出转跳地址
2016/11/04 PHP
PHP合并数组函数array_merge用法分析
2017/02/17 PHP
ThinkPHP实现登录退出功能
2017/06/29 PHP
PHP策略模式定义与用法示例
2017/07/27 PHP
laravel通过创建自定义artisan make命令来新建类文件详解
2017/08/17 PHP
javascript Math.random()随机数函数
2009/11/04 Javascript
图像替换新技术 状态域方法
2010/01/28 Javascript
jQuery中对节点进行操作的相关介绍
2013/04/16 Javascript
Jquery给基本控件的取值、赋值示例
2014/05/23 Javascript
现代 JavaScript 开发编程风格Idiomatic.js指南中文版
2014/05/28 Javascript
JavaScript简单获取系统当前时间完整示例
2016/08/02 Javascript
jquery获取easyui日期控件的值实现方法
2016/11/09 Javascript
如何清除IE10+ input X 文本框的叉叉和密码输入框的眼睛图标
2016/12/21 Javascript
javascript连接mysql与php通过odbc连接任意数据库的实例
2017/12/27 Javascript
js+canvas实现验证码功能
2020/09/21 Javascript
Vue-不允许嵌套式的渲染方法
2018/09/13 Javascript
关于layui的下拉搜索框异步加载数据的解决方法
2019/09/28 Javascript
python实现将汉字转换成汉语拼音的库
2015/05/05 Python
Python实现配置文件备份的方法
2015/07/30 Python
用python编写第一个IDA插件的实例
2018/05/29 Python
python 3.7.0 安装配置方法图文教程
2018/08/27 Python
opencv python统计及绘制直方图的方法
2019/01/21 Python
python实现五子棋游戏
2019/06/18 Python
Python3安装pip工具的详细步骤
2019/10/14 Python
Python 过滤错误log并导出的实例
2019/12/26 Python
flask 实现上传图片并缩放作为头像的例子
2020/01/09 Python
Python字符串函数strip()原理及用法详解
2020/07/23 Python
用Python实现职工信息管理系统
2020/12/30 Python
文明家庭先进事迹材料
2014/05/14 职场文书
宝葫芦的秘密观后感
2015/06/11 职场文书
环境卫生整治简报
2015/07/20 职场文书
2016年春节问候语
2015/11/11 职场文书
68行Python代码实现带难度升级的贪吃蛇
2022/01/18 Python
css3应用示例:新增的选择器
2022/03/16 HTML / CSS