Node.js进程管理之进程集群详解

 更新时间:2022年07月06日 14:14:44   作者:社会主义接班人  
这篇文章介绍了Node.js进程管理之进程集群,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
(福利推荐:【腾讯云】服务器最新限时优惠活动,云服务器1核2G仅99元/年、2核4G仅768元/3年,立即抢购>>>:9i0i.cn/qcloud

(福利推荐:你还在原价购买阿里云服务器?现在阿里云0.8折限时抢购活动来啦!4核8G企业云服务器仅2998元/3年,立即抢购>>>:9i0i.cn/aliyun

一、cluster模块

Node.js是单线程处理,对于高并发的请求怎么样能增加吞吐量呢?为了提高服务器的利用率,能不能多核的来处理呢?于是就有了cluster模块。

cluster模块可以轻松实现运行在同一机器不同进程上的TCP或HTTP服务器集群。它们仍使用相同的底层套接字,从而在相同的IP地址和端口组合上处理请求。

下面是它的一些事件属性和方法。

事件:

fork:当新的工作进程已经被派生时发出。callback函数接收worker对象作为唯一的参数。function(Worker)

online:当新的进程发回一消息,表明它已经启动时发出。callback同上。

listening:当工作进程调用listen()开始监听端口时发出。callback:fucntion(Worker,address)

disconnect:当IPC通道被切断时发出。如服务器调用worker.disconnect()的时候。callback:function(Worker)

exit:在Worker对象已断开时发出。callback:function(Worker,code,signal)

setup:在setupMaster()被首次调用时发出。

属性和方法:

settings:包含exec(工作进程的javascript文件)、args(传递的参数数组)、silent(断开工作进程的IPC机制)属性值,用于建立集群

isMaster:判断当前进程是否是主进程

isWorker:判断当前进程是否是工作进程

setupMaster([settings]):启动主进程

disconnect([callback]):断开工作进程的IPC机制,并关闭句柄,当断开连接完成时回调

worker:引用在工作进程的当前Worker对象

workers:包含Worker对象,可以通过标识从主进程引用它们。cluster.workers[workerId]

二、Worker对象

当一个工作进程被派时,一个新的Worker对象同时在主进程和工作进程中创建。在工作进程中Worker对象用来表示当前的工作进程,并与正在发生的集群事件进行交互。在主进程中,Worker对象代表子工作进程,是主应用程序向他们发送信息,接收它们的状态变化的事件甚至杀掉他们。

它也是有一些事件属性方法。

事件:

message:在工作进程收到一个新信息时发出,回调函数把message作为唯一的参数值

disconnect:在IPC通道已对这个工作进程断开后发出

exit:Worker对象已经断开时发出

error:工作进程发生错误时发出

属性方法:

id:工作进程标识

Process:工作进程运行的ChildProcess对象

suicide:对这个工作进程调用kill()或disconnect()时被设置为true。可以使用此标志来确定是否要跳出尝试的循环,并退出

send(message,[sendHandle]):将消息发送到主进程

kill([signal]):通过断开IPC通道杀掉当前工作进程,然后退出,将suicide设置为true。

disconnect():工作进程调它时,关闭所有服务器,等待关闭事件,并断开IPC通道。当从主节点调时,发送一个内部消息给工作进程,使其断开本身,设置suicide为true。

三、实践

上面的也都是理论,下面通过实现一个HTTP集群来实践一下。

1.主进程

var cluster = require('cluster');
var http = require('http');
if (cluster.isMaster) {
  cluster.on('fork', function(worker) {
    console.log("Worker " + worker.id + " created");
  });
  cluster.on('listening', function(worker, address) {
    console.log("Worker " + worker.id +" is listening on " + 
                address.address + ":" + address.port);
  });
  cluster.on('exit', function(worker, code, signal) {
    console.log("Worker " + worker.id +" Exited");    
  });
  cluster.setupMaster({exec:'cluster_worker.js'});
  var numCPUs = require('os').cpus().length;
  for (var i = 0; i < numCPUs; i++) {
    if (i>=4) break;
    cluster.fork();
  }
  Object.keys(cluster.workers).forEach(function(id) {
    cluster.workers[id].on('message', function(message){
      console.log(message);
    });
  });
}

2.工作进程

var cluster = require('cluster');
var http = require('http');
if (cluster.isWorker) {
  http.Server(function(req, res) {
    res.writeHead(200);
    res.end("Process " + process.pid + " says hello");
    process.send("Process " + process.pid + " handled request");
  }).listen(8080, function(){
    console.log("Child Server Running on Process: " + process.pid);    
  });
}

3.HTTP客户端测试

var http = require('http');
var options = { port: '8080'};
function sendRequest(){
  http.request(options, function(response){
    var serverData = '';
    response.on('data', function (chunk) {
      serverData += chunk;
    });
    response.on('end', function () {
      console.log(serverData);
    });
  }).end();
}
for (var i=0; i<5; i++){
  console.log("Sending Request");
  sendRequest();
}

首先是启动主进程,创建工作进程开始监听

"C:\Program Files (x86)\JetBrains\WebStorm 11.0.3\bin\runnerw.exe" F:\nodejs\node.exe cluster_server.js
Worker 1 created
Worker 2 created
Worker 3 created
Worker 4 created
Child Server Running on Process: 6152
Worker 1 is listening on null:8080
Child Server Running on Process: 10340
Worker 2 is listening on null:8080
Child Server Running on Process: 11412
Worker 3 is listening on null:8080
Child Server Running on Process: 12120
Worker 4 is listening on null:8080

其次启动HTTP客户端测试

"C:\Program Files (x86)\JetBrains\WebStorm 11.0.3\bin\runnerw.exe" F:\nodejs\node.exe cluster_client.js
Sending Request
Sending Request
Sending Request
Sending Request
Sending Request
Process 12120 says hello
Process 11412 says hello
Process 12120 says hello
Process 10340 says hello
Process 6152 says hello

Process finished with exit code 0

到此这篇关于Node.js进程管理之进程集群的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持程序员之家。

相关文章

  • 使用Express处理请求和托管静态资源方式

    使用Express处理请求和托管静态资源方式

    这篇文章主要介绍了使用Express处理请求和托管静态资源方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-09-09
  • Node.js中的HTTP模块与URL模块

    Node.js中的HTTP模块与URL模块

    这篇文章介绍了Node.js中的HTTP模块与URL模块,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-07-07
  • npm使用国内淘宝镜像的两种方法

    npm使用国内淘宝镜像的两种方法

    npm install时候,默认是去npm镜像源获取,很多时候蜗牛一样的速度,所以需要将安装源设置成国内的源,这样速度就会快很多,本文就来介绍一下npm使用国内淘宝镜像的两种方法,感兴趣的可以了解一下
    2023-08-08
  • 解决linux下node.js全局模块找不到的问题

    解决linux下node.js全局模块找不到的问题

    今天小编就为大家分享一篇解决linux下node.js全局模块找不到的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-05-05
  • 使用命令行升级Node.js的版本的操作指南

    使用命令行升级Node.js的版本的操作指南

    这篇文章主要给大家介绍了关于如何使用命令行升级Node.js的版本的操作指南,文中介绍的非常详细,对大家具有一定的参考学习价值,需要的朋友们下面来一起看看吧
    2023-11-11
  • NodeJs 实现简单WebSocket即时通讯的示例代码

    NodeJs 实现简单WebSocket即时通讯的示例代码

    这篇文章主要介绍了NodeJs 实现简单WebSocket即时通讯的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-08-08
  • node实现登录图片验证码的示例代码

    node实现登录图片验证码的示例代码

    这篇文章主要介绍了node实现登录图片验证码的示例代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-04-04
  • node.js基于fs模块对系统文件及目录进行读写操作的方法详解

    node.js基于fs模块对系统文件及目录进行读写操作的方法详解

    这篇文章主要介绍了node.js基于fs模块对系统文件及目录进行读写操作的方法,结合实例形式分析了nodejs使用fs模块针对文件与目录的读写、创建、删除等相关操作技巧,需要的朋友可以参考下
    2017-11-11
  • Node.js 中判断一个文件是否存在

    Node.js 中判断一个文件是否存在

    这篇文章主要记录一些 Node.js 应用中的小知识点,如果你 Google/Baidu “Node.js 如何判断文件是否存在” 发现给出的很多答案还是使用的 fs.exists,这里不推荐使用 fs.exists 你可以选择 fs.stat 或 fs.access。
    2020-08-08
  • 使用nodejs下载风景壁纸

    使用nodejs下载风景壁纸

    本文主要介绍了使用nodejs下载风景壁纸的方法。具有一定的参考价值,下面跟着小编一起来看下吧
    2017-02-02

最新评论

?


http://www.vxiaotou.com