利用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框架myJSFrame附API使用帮助
Jun 28 Javascript
javascript提取URL的搜索字符串中的参数(自定义函数实现)
Jan 22 Javascript
Seajs的学习笔记
Mar 04 Javascript
jQuery中hide()方法用法实例
Dec 24 Javascript
javascript闭包(Closure)用法实例简析
Nov 30 Javascript
常用js,css文件统一加载方法(推荐) 并在加载之后调用回调函数
Sep 23 Javascript
JavaScript实现多栏目切换效果
Dec 12 Javascript
Bootstrap CSS布局之列表
Dec 15 Javascript
Angular2开发环境搭建教程之VS Code
Dec 15 Javascript
vue实现压缩图片预览并上传功能(promise封装)
Jan 10 Javascript
基于JavaScript实现控制下拉列表
May 08 Javascript
vue实现商品列表的添加删除实例讲解
May 14 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/10/09 PHP
php记录日志的实现代码
2011/08/08 PHP
无需重新编译php加入ftp扩展的解决方法
2013/02/07 PHP
php保存二进制原始数据为图片的程序代码
2014/10/14 PHP
PHP的mysqli_thread_id()函数讲解
2019/01/24 PHP
PHP让网站移动访问更加友好方法
2019/02/14 PHP
基于pthread_create,readlink,getpid等函数的学习与总结
2013/07/17 Javascript
node.js中的fs.open方法使用说明
2014/12/17 Javascript
使用开源工具制作网页验证码的方法
2016/10/17 Javascript
简单的渐变轮播插件
2017/01/12 Javascript
jQuery使用DataTable实现删除数据后重新加载功能
2017/02/27 Javascript
Vue工程模板文件 webpack打包配置方法
2017/12/26 Javascript
vue 项目打包通过命令修改 vue-router 模式 修改 API 接口前缀
2018/06/13 Javascript
layui弹出层按钮提交iframe表单的方法
2018/08/20 Javascript
JS学习笔记之贪吃蛇小游戏demo实例详解
2019/05/29 Javascript
Node.js实现简单的爬取的示例代码
2019/06/25 Javascript
在Django的视图中使用form对象的方法
2015/07/18 Python
使用python实现个性化词云的方法
2017/06/16 Python
Python在不同目录下导入模块的实现方法
2017/10/27 Python
使用Python的package机制如何简化utils包设计详解
2017/12/11 Python
小白如何入门Python? 制作一个网站为例
2018/03/06 Python
Python判断一个list中是否包含另一个list全部元素的方法分析
2018/12/24 Python
python中partial()基础用法说明
2018/12/30 Python
Djang的model创建的字段和参数详解
2019/07/27 Python
Python内置方法实现字符串的秘钥加解密(推荐)
2019/12/09 Python
Python中实现输入超时及如何通过变量获取变量名
2020/01/18 Python
python+opencv实现移动侦测(帧差法)
2020/03/20 Python
Python日志:自定义输出字段 json格式输出方式
2020/04/27 Python
GUESS德国官网:美国牛仔服装品牌
2017/02/14 全球购物
淘宝活动策划方案
2014/02/06 职场文书
派出所所长先进事迹
2014/05/19 职场文书
会计学习心得体会
2014/09/09 职场文书
体育教师个人总结
2015/02/09 职场文书
python Tkinter的简单入门教程
2021/04/11 Python
Python 语言实现六大查找算法
2021/06/30 Python
解析MySQL索引的作用
2022/03/03 MySQL