node开启多进程和通讯方式
文章类型:node
发布者:hp
发布时间:2024-12-05
一:概述
JS执行是单线程,没有多线程的api,但可以实现多进程,更好的利用电脑的一些性能和硬件或者服务器的资源
二:内容
进程,OS进行资源分配和调度的最小单位,有独立的内存空间
线程,OS进程运算调度的最小单位,共享进程内存空间
1:使用child_process模块创建子进程:Node.js的child_process模块提供了创建和管理子进程的功能。可以使用fork()方法创建一个新的子进程,并与父进程进行通信
2:使用cluster模块实现进程间负载均衡:cluster模块是Node.js的内置模块,用于在多个CPU核心上创建子进程,并实现进程间的负载均衡。可以使用cluster.fork()方法创建多个工作进程,并通过主进程进行协调和通信
1:child_process
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)
})
2:cluster
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 开启多进程服务: