Open tiantingrui opened 2 years ago
为何需要多进程
child_process.fork
和 cluster.fork
浏览器可以通过 web worker 开启多进程
nodejs可以通过
// 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)
})
// 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 做进程守护