一篇文章介绍nodejs如何开启多进程,进程如何通讯

前言:

进程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 开启多进程服务
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Mr.怪兽

希望大家能够多多支持,我会继续

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值