"일꾼이 일을 잘하려면 먼저 도구를 갈고 닦아야 한다." - 공자, 『논어』.
첫 장 > 프로그램 작성 > 작업자 실 및 아동 프로세스의 심층 분석

작업자 실 및 아동 프로세스의 심층 분석

2025-04-13에 게시되었습니다
검색:186

작업자 스레드를 사용하면 여러 스레드에서 JavaScript 코드를 실행할 수 있습니다. SharedArraybuffer를 통해 스레드간에 메모리를 공유하고 데이터 처리 또는 계산과 같은 CPU 결합 작업을 오프로드하는 데 이상적입니다.

아동 프로세스

하위 프로세스를 사용하면 별도의 프로세스를 스폰하여 기본 Node.js 프로세스와 독립적으로 작업을 실행할 수 있습니다. 격리가 필요한 작업에 적합하거나 자바 스크립트 스크립트 또는 바이너리를 사용하지 않을 때는 적합합니다.

작업자 스레드의 실제 사용 사례

1️& 이미지 처리
크기 조정, 자르기 또는 필터 적용과 같은 대규모 이미지 변환을 처리 할 때 작업자 스레드는 이러한 작업을 별도의 스레드에 오프로드하여 메인 이벤트 루프가 차단되는 것을 방지 할 수 있습니다.

예:

const { Worker } = require('worker_threads');

function resizeImage(imagePath) {
  return new Promise((resolve, reject) => {
    const worker = new Worker('./resizeWorker.js', { workerData: imagePath });
    worker.on('message', resolve);
    worker.on('error', reject);
  });
}

// Usage
resizeImage('image.jpg').then(() => console.log('Image resized!'));

2️& 데이터 구문 분석 및 변환

대형 JSON 파일을 구문 분석하거나 CSV 데이터를 변환하는 것은 리소스 집약적 일 수 있습니다. 작업자 스레드는 청크로 데이터를 처리하여 응용 프로그램이 반응 상태를 유지할 수 있습니다.

예:

const { Worker } = require('worker_threads');

const worker = new Worker('./dataParser.js');
worker.postMessage({ filePath: 'largeData.json' });
worker.on('message', (data) => {
  console.log('Parsed Data:', data);
});

3️⃣ 수학 계산

작업자 스레드는 소수, 매트릭스 곱셈 또는 시뮬레이션과 같은 무거운 계산에 적합합니다.

예:

const { Worker } = require('worker_threads');

function calculatePrimes(limit) {
  return new Promise((resolve, reject) => {
    const worker = new Worker('./primeWorker.js', { workerData: limit });
    worker.on('message', resolve);
    worker.on('error', reject);
  });
}

// Usage
calculatePrimes(100000).then(primes => console.log(primes));

아동 프로세스에 대한 실제 사용 사례

1️& 쉘 명령 실행

응용 프로그램이 쉘 명령을 실행하여 시스템과 상호 작용 해야하는 경우 자식 프로세스는 선택입니다.

예:

const { exec } = require('child_process');

exec('ls -l', (error, stdout, stderr) => {
  if (error) {
    console.error(`Error: ${error.message}`);
    return;
  }
  console.log(`Output:\n${stdout}`);
});

2️& 가 아닌 스크립트 실행

워크 플로우가 Python, Ruby 또는 기타 스크립팅 언어와 관련된 경우 자식 프로세스를 사용하여 이러한 스크립트를 실행하고 출력을 처리 할 수 ​​있습니다.

예:

const { spawn } = require('child_process');

const pythonProcess = spawn('python', ['script.py']);

pythonProcess.stdout.on('data', (data) => {
  console.log(`Output: ${data}`);
});
); pythonprocess.stdout.on ( 'data', (data) => { console.log (`output : $ {data}`); });

3️& 마이크로 서비스 아키텍처

마이크로 서비스와 같은 접근 방식에서는 아동 프로세스를 사용하여 IPC를 통해 주요 프로세스와 통신하는 고립 된 독립적 인 작업을 처리 할 수 ​​있습니다 (프로세스 간 커뮤니케이션).


예:

const { fork } = require('child_process');

const child = fork('./childService.js');

child.on('message', (message) => {
  console.log('Message from child:', message);
});

// Send a task to the child process
child.send({ task: 'processData', payload: [1, 2, 3] });
const {fork} = require ( 'child_process'); const child = fork ( './ childservice.js'); child.on ( 'message', (메시지) => { Console.log ( '자녀의 메시지 :', 메시지); }); // 아동 프로세스에 작업을 보냅니다 child.send ({task : 'processData', 페이로드 : [1, 2, 3]});

작업자 스레드와 아동 프로세스 중에서 선택하는

SharedArraybuffer를 통해 지원됩니다 지원되지 않음 공유 환경, 덜 고립 된 완전히 고립 된 javaScript 시스템 수준 작업 또는 외부 코드 낮은 (동일한 프로세스) 더 높은 (별도의 프로세스) 메시지 전달을 통해 더 빠른 IPC를 통해 느리게 javaScript/node.js 만 모든 스크립팅 또는 시스템 수준 언어 더 빠르게 느린 덜 포함되지 않으면 프로세스가 충돌 할 수 있습니다 완전히 포함 된 고립 된 실패
특징 작업자 스레드 아동 프로세스
메모리 공유
작업 격리
사용 사례 의 CPU 집약적 인 작업
간접비
의사소통
지원되는 언어
스타트 업 시간
오류 억제

작업자 스레드 및 아동 프로세스 사용을위한 모범 사례

오프로드 집약적 인 작업 :

I/O-Heavy 작업 또는 외부 스크립트 실행에 CPU 결합 작업 및 하위 프로세스에 작업자 스레드를 사용하십시오.

성능 모니터 :

Node.js의 내장 프로파일 러와 같은 도구를 사용하여 병목 현상을 식별합니다.

오류를 우아하게 처리하십시오 :

항상 오류를 듣고 실패를 처리하기 위해 이벤트를 종료하십시오.

효과적으로 스케일 : 작업자 풀 또는 프로세스 클러스터를 사용하여 여러 스레드 또는 프로세스에 작업을 배포합니다.

결론

작업자 스레드 및 아동 프로세스는 Node.js 개발자가 단일 스레드 이벤트 루프의 한계에서 벗어날 수 있도록 권한을 부여합니다. 이러한 도구를 활용하면 CPU 및 I/O 집약적 작업을 쉽게 처리하는 고도로 확장 가능하고 반응이 좋은 응용 프로그램을 구축 할 수 있습니다. 이미지 처리, 쉘 명령 실행 또는 마이크로 서비스 관리, 작업자 스레드 및 하위 프로세스 사용시기 이해에 관계없이 Node.js 응용 프로그램에서 성능을 최적화하는 데 핵심적입니다.

Understanding Worker Threads and Child Processes

릴리스 선언문 이 기사는 https://dev.to/wallacefreitas/understanding-worker-threads-and-child-processes-52nj?1에서 재현됩니다.
최신 튜토리얼 더>

부인 성명: 제공된 모든 리소스는 부분적으로 인터넷에서 가져온 것입니다. 귀하의 저작권이나 기타 권리 및 이익이 침해된 경우 자세한 이유를 설명하고 저작권 또는 권리 및 이익에 대한 증거를 제공한 후 이메일([email protected])로 보내주십시오. 최대한 빨리 처리해 드리겠습니다.

Copyright© 2022 湘ICP备2022001581号-3