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 开启多进程服务: