node cluster,cluster nodes
本文带你了解Node中的Nodejs-cluster模块,并介绍nodeJS-Cluster模块的用法。希望对你有帮助!
node.js速度课程简介:进入学习
有时候面试官会问你,说说nodejs是怎么开始多流程的?您应该立即想到集群模块。现在让我带你讨论一下集群模块的使用。
基本用法
Node.js默认情况下在单个进程中运行。对于32位系统,它可以使用高达512MB的内存,对于64位系统,它可以使用高达1GB的内存。对于具有多核CPU的计算机来说,这是低效的,因为只有一个核心在运行,而所有其他核心都是空闲的。集群模块就是为了解决这个问题而提出的。
集群模块允许设置一个主进程和几个工作进程,主进程监控和协调工作进程的运行。工作人员通过进程间通信来交换消息。集群模块有一个内置的负载平衡器,使用循环算法来协调工作进程之间的负载。运行时,所有新建立的链接都由主进程完成,然后主进程将TCP连接分配给指定的工作进程。
var cluster=require( cluster );
var OS=require( OS );
if (cluster.isMaster){
for (var i=0,n=os.cpus()。长度;I n;i=1){
cluster . fork();
}
}否则{
http.createServer(function(req,res) {
RES . write head(200);
RES . end( hello world \ n );
}).听(8000);
}上面的代码首先判断当前进程是否为主进程(cluster.isMaster),如果是,则根据CPU核心数创建几个新的工作进程;如果不是,当前进程是一个工作进程,那么在这个进程中启动一个服务器程序。
上面的代码有一个缺点,就是一旦工作进程挂起,主进程无法知道。要解决这个问题,可以在主进程中部署在线事件和退出事件的监控功能。
var cluster=require( cluster );
if(cluster.isMaster) {
var numWorkers=require(os )。CPU()。长度;
console.log(主群集设置 numWorkers workers . );
for(var I=0;i numWorkersi ) {
cluster . fork();
}
cluster.on(online ,function(worker) {
console . log( Worker Worker . process . PID 在线);
});
cluster.on(exit ,函数(worker,code,signal) {
console . log( Worker Worker . process . PID 死了,代码: code ,信号: signal);
console.log(启动新的工作线程);
cluster . fork();
});
}在上面的代码中,一旦主进程监测到工作进程的退出事件,就会重新启动一个工作进程。一旦工作进程成功启动并可以正常运行,它将发出一个online事件。
worker对象
Worker对象是cluster.fork()的返回值,代表一个工作进程。
其属性和方法如下。
(1)工人身份证
Worker.id返回当前工作线程的唯一进程号。这个数字也是cluster.workers中指向当前进程的索引值。
(2)工作流程
的所有工作进程都是使用child_process.fork()生成的。child_process.fork()返回的对象保存在worker.process中通过该属性可以得到worker所在的process对象。
(3)worker.send()
此方法用于向主进程中的子进程发送信息。
if (cluster.isMaster) {
var worker=cluster . fork();
worker.send(你好);
} else if (cluster.isWorker) {
process.on(消息,函数(消息){
process . send(msg);
});
}上面这段代码的作用是,工作进程回显主进程发送的每一条消息。
在工作进程中,要向主进程发送消息,请使用process . send(message);要侦听来自主进程的消息,请使用下面的代码。
process.on(消息,函数(消息){
console.log(消息);
});消息可以是字符串或JSON对象。下面是一个发送JSON对象的例子。
worker.send({
类型:“任务1”,
发件人:“主人”,
数据:{
//要传输的数据
}
});cluster.workers对象
该对象仅存在于主进程中,包含所有工作进程。每个成员的键值是一个工作进程对象,键值名是工作进程的worker.id属性。
函数eachWorker(回调){
for(cluster . workers中的变量id){
回调(cluster . workers[id]);
}
}
每个工人(职能(工人){
worker.send(向全体工人大宣布);
});上面的代码用于遍历所有工作进程。
当前套接字的数据事件也可用于标识具有id属性的工作进程。
socket.on(data ,function(id) {
var worker=cluster . workers[id];
});cluster模块的属性与方法
isMaster,isWorker
master属性返回一个布尔值,该值指示当前进程是否为主进程。该属性由process.env.NODE_UNIQUE_ID确定。如果process.env.NODE_UNIQUE_ID未定义,则表示该进程为主进程。
IsWorker属性返回一个布尔值,该值指示当前进程是否为工作进程。它与isMaster属性的值相反。
fork()
fork方法用于创建新的工作进程,上下文复制主进程。只有主进程可以调用这个方法。
此方法返回一个worker对象。
kill()
kill方法用于终止工作进程。它可以接受代表系统信号的参数。
如果它当前是主进程,它将终止与worker.process的联系,然后向工作进程发送系统信号方法。如果它当前是一个工作进程,它将终止与主进程的通信,然后退出,返回0。
在以前的版本中,此方法也称为worker.destroy()。
listening事件
在工作进程调用listening方法后,“listening”事件被传输到进程的服务器,然后传输到主进程。
该事件的回调函数接受两个参数,一个是当前worker对象,一个是address对象,包含URL、端口、地址类型(IPv4、IPv6、Unix socket、UDP)等信息。这对于服务多个URL的节点应用程序非常有用。
不中断地重启Node服务
重新启动服务需要在启动前关闭。通过使用集群模块,您可以首先启动一个工作进程,然后关闭所有原始的工作进程。这样,节点服务可以不中断地重新启动。
首先,主进程向工作进程发送一个重启信号。
工人[wid]。发送({type: shutdown ,from: master });工作进程监听消息事件,一旦发现内容被关闭,就退出。
process.on(消息,函数(消息){
if(message.type===shutdown) {
process . exit(0);
}
});下面是一个关闭所有工作进程的函数。
函数restartWorkers() {
var wid,worker id=[];
for(cluster . workers中的wid
worker ids . push(wid);
}
worker ids . foreach(function(wid){
cluster.workers[wid]。发送({
文本:“关机”,
来自:“主人”
});
setTimeout(function() {
if(cluster.workers[wid]) {
cluster.workers[wid]。kill( SIGKILL );
}
}, 5000);
});
};PM2模块
PM2模块是集群模块的封装层。其功能是尽可能抽象集群模块,使用户可以像部署单进程一样部署多进程节点应用。
//app.js
var http=require( http );
http.createServer(function(req,res) {
RES . write head(200);
RES . end( hello world );
}).听(8080);用PM2从命令行启动这段代码。
$ pm2 start app.js -i 4上面的代码的I参数告诉pm2,这段代码应该以cluster_mode启动,新创建的工作进程数为4。如果I参数的值是0,那么当前机器有几个CPU核心,PM2将启动几个工作进程。
如果工作进程由于某种原因挂起,它将立即重新启动。
#重新启动所有工作进程
$ pm2 reload所有每个工作进程都有一个id。您可以使用以下命令查看单个工作进程的详细信息。
当$ pm2 show worker id关闭工作进程时,您可以部署以下代码来让工作进程侦听关闭消息。一旦收到此消息,它将在完成清理后关闭。
process.on(消息,函数(消息){
if (msg===shutdown) {
close _ all _ connections();
delete _ logs();
server . close();
process . exit(0);
}
});更多关于node的信息,请访问:nodejs教程!以上就是说说Nodejs-cluster模块,介绍一下它的使用细节。更多请关注我们的其他相关文章!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。