nodejs
Node.js는 단일 스레드 기반으로 작동하기 때문에 CPU를 많이 사용하는 작업이 많아지면 병목이 생길 수 있습니다. 이런 문제를 해결하기 위해 Node.js에서는
그중
const { fork } = require('child_process')
const { fork } = require('child_process')
const child = fork('./child.js')
child.on('message', (msg) => {
console.log('자식 프로세스로부터 메시지:', msg)
})
child.send({ hello: 'world' })
process.on('message', (msg) => {
console.log('부모로부터 메시지:', msg)
process.send({ reply: '안녕하세요 부모님' })
})
// parent.js
const { fork } = require('child_process')
const heavyWorker = fork('./heavy-task.js')
heavyWorker.on('message', (result) => {
console.log('결과 수신:', result)
})
heavyWorker.send({ job: 'calculate', payload: 999999 })
// heavy-task.js
process.on('message', ({ job, payload }) => {
if (job === 'calculate') {
let total = 0
for (let i = 0; i < payload; i++) total += i
process.send({ result: total })
}
})
const cpus = require('os').cpus()
const { fork } = require('child_process')
cpus.forEach((_, i) => {
const worker = fork('./worker.js')
worker.send({ index: i })
})
child.on('exit', (code) => {
console.log('자식 종료됨, 코드:', code)
})
child.on('error', (err) => {
console.error('자식 프로세스 에러:', err)
})
요약하자면, fork를 사용하면 Node.js 파일을 별도의 프로세스로 실행할 수 있으며, 부모와 자식 간에 메시지를 주고받을 수 있습니다. 이를 통해 멀티 프로세스 환경에서 병렬성을 확보하고, 연산 성능을 최적화하는 구조를 설계할 수 있습니다. 또한 이 방식은 Node.js의 단일 스레드 특성상 발생할 수 있는 병목 문제를 해결하는 데 매우 유용하며, 복잡한 연산을 메인 프로세스로부터 분리해 서버의 응답성을 유지하는 데 큰 도움이 됩니다.