tiantingrui / daily-harvest

记录每日收获
MIT License
2 stars 0 forks source link

nodejs如何开启多进程,进程如何通讯? #44

Open tiantingrui opened 2 years ago

tiantingrui commented 2 years ago
  1. 进程和线程的区别
  2. nodejs如何开启多进程有哪些方式,以及进程是如何通讯的?
tiantingrui commented 2 years ago

进程和线程的区别

为何需要多进程

tiantingrui commented 2 years ago

nodejs如何开启多进程有哪些方式,以及进程是如何通讯的?

  1. 开启子进程 child_process.forkcluster.fork
  2. 使用 send 和 on 传递消息

nodejs如何开启多进程,进程如何通讯 - 使用 child_process.fork

浏览器可以通过 web worker 开启多进程

nodejs可以通过

  1. fork
  2. cluster 进程
// process-fork.js
const http = require('http')
const fork = require('child_process').fork

const server = http.createServer((req, res) => {
  if (req.url = '/get-sum') {
    console.log('主进程 id', process.pid)
    // 开启子进程
    const computeProcess = fork('./compute.js')
    // 给子进程发送消息
    computeProcess.send('开始计算')

    // 接收子进程的消息
    computeProcess.on('message', data => {
      console.log('主进程接收到的信息:', data)
      res.end('sum is' + data)
    })
    computeProcess.on('close', () => {
      console.log('子进程因报错而退出')
      computeProcess.kill()
      res.end('error')
    })
  }
})

server.listen(3000, () => {
  console.log('localhost: 3000')
})

// compute.js 子进程,计算
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)
})

nodejs如何开启多进程,进程如何通讯 - 使用 cluster 方式

// cluster.js
const http = require('http')
// 获取cpu核数
const cpuCoreLength = require('os').cpus().length
const cluster = require('cluster')

if (cluster.isMaster) {
  // 主进程
  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 做进程守护