利用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实现控制内容的向上向下滚动效果
Jun 26 Javascript
Extjs4 关于Store的一些操作(加载/回调/添加)
Apr 18 Javascript
JavaScript中几个重要的属性(this、constructor、prototype)介绍
May 19 Javascript
同域jQuery(跨)iframe操作DOM(示例代码)
Dec 13 Javascript
javascript学习笔记(一)基础知识
Sep 30 Javascript
异步JavaScript编程中的Promise使用方法
Jul 28 Javascript
关于JavaScript限制字数的输入框的那些事
Aug 14 Javascript
微信小程序 简单教程实例详解
Jan 13 Javascript
详解vue几种主动刷新的方法总结
Feb 19 Javascript
微信小程序swiper禁止用户手动滑动代码实例
Aug 23 Javascript
小程序实现锚点滑动效果
Sep 23 Javascript
js瀑布流布局的实现
Jun 28 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
Array of country list in PHP with Zend Framework
2011/10/17 PHP
phpstrom使用xdebug配置方法
2013/12/17 PHP
thinkphp中ajax与php响应过程详解
2014/12/08 PHP
PHP实现Javascript中的escape及unescape函数代码分享
2015/02/10 PHP
php数字运算验证码的实现代码
2015/07/30 PHP
php文件管理基本功能简单操作
2017/01/16 PHP
Laravel中Facade的加载过程与原理详解
2017/09/22 PHP
PHP内部实现打乱字符串顺序函数str_shuffle的方法
2019/02/14 PHP
PHP从零开始打造自己的MVC框架之类的自动加载实现方法详解
2019/06/03 PHP
Extjs ajax同步请求时post方式参数发送方式
2009/08/05 Javascript
Javascript 类型转换方法
2010/10/24 Javascript
使用 JScript 创建 .exe 或 .dll 文件的方法
2011/07/13 Javascript
滚动图片效果 jquery实现回旋滚动效果
2013/01/08 Javascript
jquery遍历checkbox的注意事项说明
2014/02/21 Javascript
深入剖析JavaScript中的枚举功能
2014/03/06 Javascript
使用Sticker.js实现贴纸效果
2015/01/28 Javascript
JavaScript获取网页中第一个图片id的方法
2015/04/03 Javascript
表单验证正则表达式实例代码详解
2015/11/09 Javascript
vue-router路由简单案例介绍
2017/02/21 Javascript
Emberjs 通过 axios 下载文件的方法
2019/09/03 Javascript
[43:35]TI4 循环赛第二日Liquid vs Fnatic
2014/07/11 DOTA
Python求两个list的差集、交集与并集的方法
2014/11/01 Python
python根据开头和结尾字符串获取中间字符串的方法
2015/03/26 Python
Flask的图形化管理界面搭建框架Flask-Admin的使用教程
2016/06/13 Python
Python编写登陆接口的方法
2017/07/10 Python
python 读取Linux服务器上的文件方法
2018/12/27 Python
python 格式化输出百分号的方法
2019/01/20 Python
python 解决cv2绘制中文乱码问题
2019/12/23 Python
python pprint模块中print()和pprint()两者的区别
2020/02/10 Python
django 解决自定义序列化返回处理数据为null的问题
2020/05/20 Python
活动宣传策划方案
2014/05/23 职场文书
2014年个人债务授权委托书范本
2014/09/22 职场文书
教学改革问题查摆整改措施
2014/09/27 职场文书
催款函怎么写
2015/06/24 职场文书
大学生入党自传2015
2015/06/26 职场文书
个人工作失误的保证书怎么写?
2019/06/21 职场文书