• 为何需要多进程
    • 多核 CPU,更适合处理多进程
    • 内存较大,多个进程才能更好的利用(单进程有内存上限)
    • “压榨”机器资源,更快,更节省
  • 如何开启多进程并通信
    • 使用 child_process.fork

      // 主进程
      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.id)
      		// 开启子进程
      		const computeProcess = fork('./compute.js')
      		computeProcess.send('开始计算')
      		computeProcess.on('message', data => {
      			console.log('主进程接收到的信息:', data)
      			res.send('sum is ' + data)
      		})
      		conmputeProcess.on('close', () => {
      			console.info('子进程因报错而退出')
      			computeProcess.kill()
      		})		
      	}
      }
      // 子进程 compute.js
      function getSum() {
      	let sum = 0;
      	for (let i = 0; i < 1000000; i++) {
      		sum += 1
      	}
      	return sum
      }
       
      process.on('message', (data) => {
      	console.log('子进程 id', process.id)
      	console.log('子进程接收到的信息: ', data)
      	const sum = getSum()
      	// 发送消息给主进程
      	process.on(sum)
      })
    • 使用 cluster

      const http = require('http')
      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.send('done')
      	})
      	server.listen(3000)
      }
  • 实际工作中使用 PM2