前言:
进程vs线程
进程:资源调度的单位,进行内存和资源分配。
线程:线程中计算的单位。
JS是单线程
js的执行是单线程的,没有进行多线程的api,只是能开启多进程。
为何需要多进程?
从cpu和服务器考虑,是为了更好的利用电脑的一些性能和硬件或者服务器的资源。
开启多进程方式
nodejs开启多进程一般用到以下两种方式:
开启子进程 child_process.fork 和 cluster.fork 进行通讯。
使用 send 和 on 进行通讯。
使用 send 和 on 进行通讯
案例如下:
主进程代码:
const http = require('http')
const fork = require('child_process').fork
const server = http.createServer((req,res)=>{
if(req.url==='/get-sum'){
console.info('主进程 id',process.pid);
// 开启子进程
const conputeProcess = fork('./compute.js')
conputeProcess.send('开始计算')
// 主进程接收子进程的消息
conputeProcess.on('message',data=>{
console.log('主进程接收到的信息:',data);
res.end('sum is'+data)
})
// 监听子进程意外关闭情况
conputeProcess.on('close',()=>{
console.log('子进程意外关闭了');
})
}
})
server.listen(3000,() => {
console.info('localhost listening on 3000');
})
子进程代码:
// 子进程 用于计算
function getSum(){
let sum=0
for(let i =0; i < 10000; i++){
sum += i
}
return sum
}
process.on('message',data=>{
console.log('子进程id',process.pid);
console.log('子进程接收到的信息:',data);
const sum = getSum()
// 返回消息给主进程
process.send(sum)
})
开启子进程 child_process.fork 和 cluster.fork 进行通讯
案例如下:
const http = require('http')
// 获取cpu的核数
const cpuCoreLength = require('os').cpus().length
const cluster = require('cluster')
// 判断是否是主进程
if(cluster.isMaster){
// 根据电脑cpu的核数开启对应数量的子进程
for(let i = 0; i < cpuCoreLength; i++){
cluster.fork() //开启子进程
}
// 监听退出
cluster.on('exit',worker=>{
console.log('子进程退出');
cluster.fork() //进程守护 再开启一个进程
})
}else{
// 每个子进程创建一个服务
// 多个子进程会共享一个 TCP 链接,提供一份网络服务
const server = http.createServer((req,res)=>{
res.writeHead(200)
res.end('done')
})
server.listen(3000)
}
// 工作中,使用 PM2 开启多进程服务