前言
cluster:Cluster
属性
cluster.isMaster:Boolean
返回一个布尔值,表示当前进程是否为主进程。这个属性由process.env.NODE_UNIQUE_ID决定,如果process.env.NODE_UNIQUE_ID为未定义,就表示该进程是主进程
const cluster=require('cluster');
cluster.isMaster
cluster.isWorker:Boolean
返回一个布尔值,与cluster.isMaster相反,表明进程是否是工作进程
cluster.isWorker
cluster.workers:Map< {id:Worker} >
返回一个,以id为key,worker进程对象为value的hash对象
const workers= cluster.workers;
for(id in workers){
const worker=workers[id];
}
cluster.worker:Worker
返回一个当前工作进程的引用,主进程不可用
if(cluster.isWorker){
console.log(`当前工作空间的引用${cluster.worker.id}`)
}
方法
cluster.fork():Worker
fork方法用于新建一个worker进程,上下文都复制主进程。只有主进程才能调用这个方法,在工作进程内调用此方法,会导致当前工作进程退出
cluster.fork();
cluster.disconnect(callback)
对所有worker进程调用disconnect方法,使得所有worker断开连接,接受一个callback回调函数,callback会在所有的worker断开连接后执行.
cluster.disconnect(()=>{
console.log("所有连接断开后执行")
})
事件
cluster.on(‘message’)
worker进程调用send时触发
if(cluster.isMaster){
cluster.on('message',(worker,data)=>{
console.log(data); // {data:'data'}
})
} else {
process.send({data:'data'})
}
cluster.on(‘exit’)
worker进程死亡时,集群模块将触发 ‘exit’ 事件。可以通过fork创建一个新的worker
if(cluster.isMaster){
cluster.on('exit',(worker)=>{
console.log("exit",worker)
cluster.fork(); // 当监听到一个worker kill后,再次派生一个worker,保持worker数量
})
} else {
cluster.worker.kill();
}
cluster.on(‘disconnect’)
当工作进程正常退出、被杀死、或手动断开连接(例如使用 worker.disconnect())时触发
if(cluster.isMaster){
cluster.on('disconnect',(worker)=>{
console.log("disconnect",worker)
cluster.fork(); // 当监听到一个worker kill后,再次派生一个worker,保持worker数量
})
} else {
cluster.worker.kill();
// 或者
cluster.worker.disconnect();
}
cluster.on(‘fork’)
当worker进程被fork时触发
if(cluster.isMaster){
cluster.on('fork',(worker)=>{
console.log("exit",worker)
cluster.fork(); // 当监听到一个worker kill后,再次派生一个worker,保持worker数量
})
}
worker:Worker
属性
worker.exitedAfterDisconnect
worker由于.kill() 或 .disconnect() 退出,则此属性为 true。 如果工作进程以任何其他方式退出,则为 false。可以通过值判断是否时自愿退出
cluster.on('exit', (worker, code, signal) => {
if (worker.exitedAfterDisconnect === true) {
console.log('Oh, it was just voluntary – no need to worry');
}
});
// 杀死工作进程
worker.kill();
worker.id
worker进程的唯一id,一般用来从cluster.workers查找指定worker
cluster.workers[worker.id];
方法
worker.send()
与主进程进行通讯,触发cluster.message事件,send接受字符串或者json对象
worker.send({
type:"
})
worker.send('msg')
worker.disconnect()
终端与主进程的连接,触发cluster.disconnect事件
worker.disconnect();
worker.kill()
杀死worker进程,将会触发cluster.disconnect事件、cluster.exit事件
worker.kill()
事件
disconnect
调用kill()和disconnect(),都会触发此事件,只在本工作进程中生效
if(cluster.isMaster){
const worker=cluster.fork();
worker.on("message",(data)=>{
console.log("data====",data); // index
})
}
// worker
process.send("index")
message
监听worker进程数据通讯,只能在主进程中使用,与cluster.on(“message”)不同的是,它只会监听特定的worker
if(cluster.isMaster){
const worker=cluster.fork();
worker.on("message",(data)=>{
console.log("data====",data); // index
})
}
// worker
process.send("index")
exit
worker调用kill()触发
if(cluster.isMaster){
const worker=cluster.fork();
worker.on("message",(data)=>{
console.log("data====",data); // index
})
}
// worker
process.send("index")
error
子应用中出现未捕获的异常时触发
if(cluster.isMaster){
const worker=cluster.fork();
worker.on("error",(data)=>{
console.log("error====",data); // index
})
}
// worker
throw Error("error")