node中的cluster模块开启进程,进程共享数据

说明:共享数据 var collection = [41, 41, 41, 41]

master.js

         

console.log('###---start---###')


var cluster = require('cluster')
const numCpus = require('os').cpus().length
cluster.setupMaster({
exec: 'worker.js',
slient: true
})
if (cluster.isMaster) {
var collection = [41, 41, 41, 41]
var st = Date.now()
for (let i = 0; i < numCpus; i++) {
var wk = cluster.fork()
wk.send(collection[i])
}
cluster.on('fork',worker=>{
console.log(`[master]: fork worker ${worker.id}`)
})
cluster.on('exit',(worker,code,signal)=>{
console.log(`[master]:worker ${worker.id} died`)
})

var numCount = 0
Object.keys(cluster.workers).forEach(id=>{
cluster.workers[id].on('message',msg=>{
console.log(`[master] receive message from [worker ${id}]:${msg}`)
numCount++
if(numCount == collection.length){
console.log(`master finish all work adn using ${Date.now() - st} ms`)
cluster.disconnect()
}

})
})
}

worker.js

var cluster = require('cluster')
function fibo(n) {
return n == 0 ? 0 : n > 1 ? fibo(n - 1) + fibo(n - 2) : 1
}
console.log(`worker ${cluster.worker.id} start...`)
process.on('message',msg=>{
console.log(` ${cluster.worker.id} receive data is ${msg}`)
var st = Date.now()
console.log(`worker ${cluster.worker.id} start to work`)
var result = fibo(msg)
console.log(`worker ${cluster.worker.id} finish work and using ${Date.now() - st} ms`)
process.send(result)
})

打印日志如下: 

node master.js

###---start---###

[master]: fork worker 1

[master]: fork worker 2

[master]: fork worker 3

[master]: fork worker 4

worker 4 start...

worker 2 start...

 4 receive data is 41

 2 receive data is 41

worker 2 start to work

worker 4 start to work

worker 1 start...

 1 receive data is 41

worker 1 start to work

worker 3 start...

 3 receive data is 41

worker 3 start to work

worker 2 finish work and using 4905 ms

[master] receive message from [worker 2]:165580141

worker 4 finish work and using 4918 ms

[master] receive message from [worker 4]:165580141

worker 1 finish work and using 4921 ms

[master] receive message from [worker 1]:165580141

worker 3 finish work and using 4933 ms

[master] receive message from [worker 3]:165580141

master finish all work adn using 5094 ms

[master]:worker 1 died

[master]:worker 4 died

[master]:worker 2 died

[master]:worker 3 died

posted @ 2018-07-26 18:30  江山一族  阅读(170)  评论(0编辑  收藏  举报