利用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判断两个元素是否有重叠部分的代码
Jul 25 Javascript
JQuery实现用户名无刷新验证的小例子
Mar 22 Javascript
jQuery基于muipicker实现仿ios时间选择
Feb 22 Javascript
jquery单击事件和双击事件冲突解决方案
Mar 02 Javascript
使用gulp搭建本地服务器并实现模拟ajax
Apr 05 Javascript
Angular事件之不同组件间传递数据的方法
Nov 15 Javascript
javascript实现遮罩层动态效果实例
May 14 Javascript
详解利用eventemitter2实现Vue组件通信
Nov 04 Javascript
vue keep-alive 动态删除组件缓存的例子
Nov 04 Javascript
Flexible.js可伸缩布局实现方法详解
Nov 13 Javascript
jQuery冲突问题解决方法
Jan 19 jQuery
vue里使用create, mounted调用方法
Apr 26 Vue.js
微信小程序使用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的简易冒泡法代码分享
2012/08/28 PHP
Apache下禁止php文件被直接访问的解决方案
2013/04/25 PHP
php calender(日历)二个版本代码示例(解决2038问题)
2013/12/24 PHP
PHP实现自动识别Restful API的返回内容类型
2015/02/07 PHP
CI框架集成Smarty的方法分析
2016/05/17 PHP
Laravel学习教程之View模块详解
2017/09/18 PHP
Mootools 1.2教程 事件处理
2009/09/15 Javascript
Web前端设计模式  制作漂亮的弹出层
2010/10/29 Javascript
模拟jQuery ajax服务器端与客户端通信的代码
2011/03/28 Javascript
window.event快达到全浏览器支持了,以后使用就方便了
2011/11/30 Javascript
文本框只能选择数据到文本框禁止手动输入
2013/11/22 Javascript
vue2.0开发实践总结之入门篇
2016/12/06 Javascript
ThinkJS中如何使用MongoDB的CURD操作
2016/12/13 Javascript
详解vue-cli中模拟数据的两种方法
2018/07/03 Javascript
小程序云开发教程如何使用云函数实现点赞功能
2019/05/18 Javascript
浅析vue-router中params和query的区别
2019/12/24 Javascript
jQuery实现异步上传一个或多个文件
2020/08/17 jQuery
[22:20]初生之犊-TI4第5名LGD战队纪录片
2014/08/13 DOTA
Python实现提取谷歌音乐搜索结果的方法
2015/07/10 Python
解决Python网页爬虫之中文乱码问题
2018/05/11 Python
python print出共轭复数的方法详解
2019/06/25 Python
在Pytorch中使用样本权重(sample_weight)的正确方法
2019/08/17 Python
浅谈keras通过model.fit_generator训练模型(节省内存)
2020/06/17 Python
在pycharm中文件取消用 pytest模式打开的操作
2020/09/01 Python
python利用opencv实现颜色检测
2021/02/23 Python
能否解释一下XSS cookie盗窃是什么意思
2012/06/02 面试题
医学检验专业个人求职信范文
2013/12/04 职场文书
爱国演讲稿400字
2014/05/07 职场文书
上课迟到检讨书300字
2014/10/15 职场文书
避暑山庄导游词
2015/02/04 职场文书
党员身份证明材料
2015/06/19 职场文书
堂吉诃德读书笔记
2015/06/30 职场文书
SQL Server中交叉联接的用法详解
2021/04/22 SQL Server
nginx中封禁ip和允许内网ip访问的实现示例
2022/03/17 Servers
Android studio 简单计算器的编写
2022/05/20 Java/Android
Mysql数据库group by原理详解
2022/07/07 MySQL