nodejs

child_process.fork

Node.js는 단일 스레드 기반으로 작동하기 때문에 CPU를 많이 사용하는 작업이 많아지면 병목이 생길 수 있습니다. 이런 문제를 해결하기 위해 Node.js에서는 child_process 모듈을 통해 멀티 프로세스를 사용할 수 있도록 지원합니다.


그중 child_process.fork별도의 Node.js 프로세스를 생성하고, 부모-자식 간 메시지를 주고받을 수 있는 구조를 제공합니다. 주로 병렬 작업 처리, 워커 분산 처리, 비동기 프로세싱에서 활용됩니다.


fork란?

child_process-fork
const { fork } = require('child_process')
  • forkchild_process.spawn의 특수한 형태로, Node.js 모듈을 자식 프로세스로 실행할 때 사용됩니다.
  • 실행된 자식 프로세스는 부모 프로세스와 IPC 채널(Inter-Process Communication)을 통해 메시지를 주고받을 수 있습니다.

기본 예제

부모 프로세스 코드: parent.js

child_process-fork
const { fork } = require('child_process')
 
const child = fork('./child.js')
 
child.on('message', (msg) => {
  console.log('자식 프로세스로부터 메시지:', msg)
})
 
child.send({ hello: 'world' })

자식 프로세스 코드: child.js

child_process-fork
process.on('message', (msg) => {
  console.log('부모로부터 메시지:', msg)
  process.send({ reply: '안녕하세요 부모님' })
})

활용 예시

1. 무거운 연산을 자식 프로세스로 분리하기

child_process-fork
// 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 })
child_process-fork
// 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 })
  }
})

2. 여러 워커를 생성해서 분산 처리

child_process-fork
const cpus = require('os').cpus()
const { fork } = require('child_process')
 
cpus.forEach((_, i) => {
  const worker = fork('./worker.js')
  worker.send({ index: i })
})

fork의 장점

  • 병렬 처리가 가능하여 CPU 사용률을 효율적으로 분산할 수 있습니다.
  • 부모-자식 간 메시지 기반 통신이 가능해 구조적이고 안전한 프로세스 관리 가능합니다.
  • exec, spawn과 달리 Node.js 전용 코드 실행에 최적화되어 있습니다.

주의할 점

  • 자식 프로세스는 메모리 공간이 독립되므로 데이터를 직접 공유할 수 없고, 메시지로만 전달됩니다.
  • 너무 많은 프로세스를 생성하면 오히려 시스템 리소스가 낭비될 수 있습니다.
  • 안정적인 서비스를 위해, 아래와 같이 자식 프로세스 종료 감시 및 에러 처리를 추가해주어야 합니다.
child_process-fork
child.on('exit', (code) => {
  console.log('자식 종료됨, 코드:', code)
})
 
child.on('error', (err) => {
  console.error('자식 프로세스 에러:', err)
})

마무리

child_process.fork는 Node.js 애플리케이션에서 CPU 집중 작업을 효과적으로 분리할 수 있는 강력한 도구입니다. 특히 실시간 처리, 병렬 연산, 워커 기반 구조를 설계할 때 꼭 알아두어야 할 API입니다.


요약하자면, fork를 사용하면 Node.js 파일을 별도의 프로세스로 실행할 수 있으며, 부모와 자식 간에 메시지를 주고받을 수 있습니다. 이를 통해 멀티 프로세스 환경에서 병렬성을 확보하고, 연산 성능을 최적화하는 구조를 설계할 수 있습니다. 또한 이 방식은 Node.js의 단일 스레드 특성상 발생할 수 있는 병목 문제를 해결하는 데 매우 유용하며, 복잡한 연산을 메인 프로세스로부터 분리해 서버의 응답성을 유지하는 데 큰 도움이 됩니다.


참고 문서