進(jìn)程原則:
1.普通程序不能創(chuàng)建進(jìn)程,只有系統(tǒng)程序才能創(chuàng)建進(jìn)程
2.普通程序的進(jìn)程是分裂出來(lái)的盹廷,只有主進(jìn)程能分裂
3.分裂出來(lái)的兩個(gè)進(jìn)程執(zhí)行的是同一套代碼
4.父子進(jìn)程之間可以共享句柄
創(chuàng)建一個(gè)簡(jiǎn)單的進(jìn)程程序:
const cluster = require('cluster')
if(cluster.isMaster){//判斷是否為主進(jìn)程
cluster.fork()
}
console.log('一個(gè)進(jìn)程')
執(zhí)行后發(fā)現(xiàn)報(bào)錯(cuò)征绸,這是因?yàn)檫`反了第二個(gè)進(jìn)程原則,打印出來(lái)的"一個(gè)進(jìn)程"是主進(jìn)程也就是第一個(gè)進(jìn)程打印的速和,而子進(jìn)程也就是第二個(gè)進(jìn)程在執(zhí)行這份代碼的時(shí)候歹垫,已經(jīng)不能再創(chuàng)建子子進(jìn)程,因此報(bào)錯(cuò)
所以要加一個(gè)判斷:
const cluster = require('cluster')
if(cluster.isMaster){//判斷是否為主進(jìn)程
cluster.fork()
}
console.log('一個(gè)進(jìn)程')
結(jié)果console了兩遍:
那么要開(kāi)多少個(gè)進(jìn)程才能最大效率的利用資源呢颠放,這取決于你的cpu核數(shù)
const cluster = require('cluster')
const os = require('os')
if(cluster.isMaster){//判斷是否為主進(jìn)程
for(let i = 0;i < os.cpus().length;i++){//os.cpus返回系統(tǒng)cpu核數(shù)
cluster.fork()
}
console.log('主進(jìn)程')
}else{
console.log('子進(jìn)程')
}
看一下結(jié)果
一般情況下主進(jìn)程用來(lái)監(jiān)視排惨,子進(jìn)程用來(lái)干活,所以我們升級(jí)一下程序碰凶,用子進(jìn)程來(lái)進(jìn)行網(wǎng)絡(luò)操作
const http = require('http')
const cluster = require('cluster')
const os = require('os')
const process = require('process')
if(cluster.isMaster){//判斷是否為主進(jìn)程
for(let i = 0;i < os.cpus().length;i++){//os.cpus返回系統(tǒng)cpu核數(shù)
cluster.fork()
}
console.log('主進(jìn)程')
}else{
let server = http.createServer((req,res)=>{
res.write('hhh')
res.end()
})
server.listen(5000)
console.log('子進(jìn)程服務(wù)器' + process.pid + '已啟動(dòng)暮芭,在端口5000上')
}
看一下結(jié)果,四個(gè)子進(jìn)程公用一個(gè)端口欲低,這符合進(jìn)程第四個(gè)原則辕宏,"句柄"在這里就是端口
改一下代碼,看一下當(dāng)客戶端發(fā)起請(qǐng)求時(shí)砾莱,哪一個(gè)子進(jìn)程服務(wù)器執(zhí)行了響應(yīng)
let server = http.createServer((req,res)=>{
console.log('子進(jìn)程服務(wù)器' + process.pid + '在干活')
res.write('hhh')
res.end()
})
發(fā)起多次請(qǐng)求瑞筐,結(jié)果發(fā)現(xiàn)是同一個(gè)子進(jìn)程服務(wù)器執(zhí)行了響應(yīng)
這是因?yàn)椋M(jìn)程調(diào)度之間存在開(kāi)銷(xiāo)腊瑟,如果頻繁切換執(zhí)行響應(yīng)的進(jìn)程聚假,會(huì)造成過(guò)多開(kāi)銷(xiāo)块蚌,所以會(huì)先用一個(gè)進(jìn)程,如果這個(gè)進(jìn)程資源占滿膘格,再開(kāi)啟第二個(gè)峭范,這樣最高效
多個(gè)進(jìn)程:第一個(gè)滿了->啟動(dòng)第二個(gè)->第二個(gè)也滿了->啟動(dòng)第三個(gè)->......