Nodejs的朋友知道节点是单
线程的,也就是说,在8核CPU上
运行,只能使用核动力。
单线程一直是对节点的批评,但是随着版本0.6中集群的引入,这种
情况已经改变了。开发人员可以依靠集群将其节点
服务器
扩展到
多线程服务器。
克拉斯特是什么
集群是由节点提供的多线程库。
用户可以使用它来
创建多个线程,在线程之间共享侦听端口。当对这个端口有外部请求时,集群会将请求转发给随机线程,因为每个节点线程占用几十兆字节的
内存,所以它不能像PHP那样为每个请求创建线程。一般来说,创建的线程数不会超过CPU的
核心数量。
复制代码代码如下所示:
VaR集群=需要('cluster);
var http =需要('http');
无功numcpus =需要('os)。CPU(长度);
如果(集群。是大师){
叉子/工人。
对于(var i = 0;i < numcpus;i++){
Cluster.fork();
}
Cluster.on('exit
功能(工人、编码、
信号){
console.log('worker + worker.process.pid +‘死');
});
{人}
可以共享任何TCP
连接 在这种情况下,它是一个HTTP服务器
http.createserver(功能(REQ,RES){
(200)res.writehead;
res.end(你好世界;
}听(8000);
}
如上面的代码所示,cluster.ismaster将
设置为true,当
程序运行时。在调用cluster.fork(),程序将创建一个线程并再次运行它,当cluster.ismaster是假。我们使用这个变量来确定当前线程是否是一个子线程。
还可以注意到,每个子线程
都是为了监听8000端口而不引起冲突的,这是集群共享端口的
函数。
线程间的通信
当线程被创建,他们不相互之间共享内存或数据。所有数据交流只能通过worker.send和worker.on主线程
处理(
消息、处理),和广播
系统的一个例子如下。
复制代码代码如下所示:
VaR集群=需要('cluster);
var http =需要('http');
无功numcpus =需要('os)。CPU(长度);
如果(集群。是大师){
var
工作者= { };
新工
功能newworker(){
VaR的工人= cluster.fork();
如果
类型监视器信息,广播,确定为广播
worker.on(消息功能(MSG){
如果(味精。型= = 'broadcast){
事件= msg.event VaR;
把这个发送给所有的工作者/广播
workers.foreach(功能(工人){)
worker.send(事件);
})
}
});
返回的工人;
}
对于(var i = 0;i < numcpus;i++){
Workers.push(newworker());
}
Cluster.on(online,功能(工人){
console.log('worker %d是在线的,工人身份);
})
{人}
VaR的工人= cluster.worker;
广播是将类型发送到广播,事件是广播内容。
广播=函数(事件){
worker.send({
类型:'broadcast,
事件:事件
});
}
/ /在worker.on似乎没有听返回的信息
process.on(消息功能(事件){
console.log('worker:+工人。ID + 'recived事件+事件。workerid);
})
发送广播
worker.broadcast({
网上的消息,
workerid:worker.id
})
}
应注意的问题
上面提到的线程不能共享数据,也就是,所有的数据交换只能通过线程之间的通信和数据交换。交换是可序列化的,所以功能,
文件描述符,和HttpResponse无法通过。
如果使用集群,则需要考虑在编程时进行数据交换的问题。我自己的方式来存储所有这些数据的类似会议在redis,每个线程在访问和做好所有的数据没有放在节点存储器。
最后,集群现在被正式标记为节点作为实验状态,API可能在未来发生变化。