说明:共享数据 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