利用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 相关文章推荐
用javascript实现的激活输入框后隐藏初始内容
Jun 29 Javascript
javascript 传统事件模型构造的事件监听器实现代码
May 31 Javascript
简单谈谈javascript中的变量、作用域和内存问题
Aug 30 Javascript
jQuery Ajax 全局调用封装实例代码详解
Jun 02 Javascript
JS实现保留n位小数的四舍五入问题示例
Aug 03 Javascript
jQuery Masonry瀑布流插件使用方法详解
Jan 18 Javascript
Angularjs自定义指令实现三级联动 选择地理位置
Feb 13 Javascript
jQuery实现动态删除LI的方法
May 30 jQuery
canvas+gif.js打造自己的数字雨头像的示例代码
Oct 26 Javascript
jquery 获取索引值在一定范围的列表方法
Jan 25 jQuery
vue下拉菜单组件(含搜索)的实现代码
Nov 25 Javascript
解决layer弹出层msg的文字不显示的问题
Sep 11 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实现ping
2006/10/09 PHP
php生成微信红包数组的方法
2019/09/05 PHP
推荐dojo学习笔记
2007/03/24 Javascript
JavaScript 核心参考教程 内置对象
2009/10/13 Javascript
ASP中进行HTML数据及JS数据编码函数
2009/11/11 Javascript
jquery插件制作 手风琴Panel效果实现
2012/08/17 Javascript
js获取IFRAME当前的URL的方法
2013/11/13 Javascript
innerText 使用示例
2014/01/23 Javascript
javascript检测flash插件是否被禁用的方法
2016/01/14 Javascript
不定义JQuery插件 不要说会JQuery
2016/03/07 Javascript
Bootstrap组件(一)之菜单
2016/05/11 Javascript
最全的Javascript编码规范(推荐)
2016/06/22 Javascript
浅谈在js传递参数中含加号(+)的处理方式
2016/10/11 Javascript
jQuery给表格添加分页效果
2017/03/02 Javascript
Bootstrap下拉菜单Dropdowns的实现代码
2017/03/17 Javascript
JavaScript创建对象的七种方式全面总结
2017/08/21 Javascript
jquery ajax异步提交表单数据的方法
2017/10/27 jQuery
原生js封装的ajax方法示例
2018/08/02 Javascript
vue键盘事件点击事件加native操作
2020/07/27 Javascript
jQuery实现二级导航菜单的示例
2020/09/30 jQuery
python threading模块操作多线程介绍
2015/04/08 Python
python基于右递归解决八皇后问题的方法
2015/05/25 Python
python中使用序列的方法
2015/08/03 Python
不管你的Python报什么错,用这个模块就能正常运行
2018/09/14 Python
pandas数据集的端到端处理
2019/02/18 Python
Python 去除字符串中指定字符串
2020/03/05 Python
python中判断数字是否为质数的实例讲解
2020/12/06 Python
Python3+Flask安装使用教程详解
2021/02/16 Python
银行类自荐信
2014/02/04 职场文书
人力资源职位说明书
2014/07/29 职场文书
党的群众路线教育实践活动对照检查材料
2014/09/22 职场文书
2014教师年度思想工作总结
2014/11/10 职场文书
社区工作者个人总结
2015/02/28 职场文书
烈士陵园扫墓感想
2015/08/07 职场文书
Redis入门教程详解
2021/08/30 Redis
Python实现简单得递归下降Parser
2022/05/02 Python