본문 바로가기
node.js & nginx

6. Node.js Worker Thread

by 프갭 2023. 5. 19.

1) 개요

노드는 단일 스레드에서 실해되고, 이벤트 루프에는 한 번에 하나의 프로세스만 발생합니다.
(병렬로 실행되지 않는다.)

만약 인 메모리에서 발생하는 대규모 데이터 세트의 복잡한 계산같은 CPU 자원을 많이 사용하는 코드가 있으면, 이 코드가 다른 프로세스가 실행되는걸 차단할 수도 있습니다.

마찬가지로, CPU 자원을 많이 사용하는 코드가 있는 서버에 요청하는 경우, 이 코드가 이벤트 루프를 차단하고 다른 요청들이 처리되지 않게 할 수도 있습니다.

CPU 작업과 I/O 작업을 구분하는 게 중요합니다.
앞에서 말했듯이, Node.js 코드는 병렬로 실행되지 않습니다. 
오직 I/O 작업만 비동기식으로 실행되므로, 병렬로 실행(Non Blocking I/O)됩니다.

그래서 워커 스레드는 I/O 집약적인 일에는 별로 효과적이지 못한데, 왜냐하면 비동기적 I/O 작업이 워커가 하는 것보다 더 효율적이기 때문입니다.
워커의 가장 중요한 목표는 I/O 작업이 아닌 CPU 집약적인 작업의 퍼포먼스를 향상시키는 겁니다.

2) Worker Thread 사용

#worker 클래스는 독립적인 자바스크립트 실행 스레드를 의미하고, parentPort는 메세지 
#포트의 인스턴스입니다.
const { worker,parentPort } = require('worker_threads')

#워커를 시작하는 두 가지 메인 방법입니다(파일명을 넘기거나, 실행하고자 하는 코드를 작성하거나). 
#실제 제작시 파일명을 사용하는 편이 권장됩니다.
new Worker(filename) 이나 new Worker(code, {eval: true}) 

#다른 스레드간 메세지를 주고받을 때 사용합니다.
worker.on('message'), worker.postMessage(data)

#parentPort.postMessage(data) 를 통해 보내진 메세지는 worker.on('message') 를 
#사용한 부모 스레드에서 사용 가능합니다. 그리고 worker.postMessage(data) 를 
#사용한 부모 스레드로부터 보내진 메세지는 parentPort.on('message') 를 
#사용한 스레드에서 사용 가능합니다.
parentPort.on('message'), parentPort.postMessage(data)

3) Worker Thread Code

######### main.js 메인스레드 코드
const { Worker } = require('worker_threads');

#postMessage 를 이용하여 메시지 전달
const worker = new Worker("./src/worker/w.js");
#워커로부터 받은 메시지.
worker.on('message', message => {});
#워커 종료 이벤트
worker.on('exit', () => { }); 
#워커로 메시지 전달
worker.postMessage(cnt);

#workerData 를 이용하기
const worker = new Worker("./src/worker/w2.js",{workerData:{count:cnt}});
#워커로부터 받은 메시지.
worker.on('message', message => {});
#워커 종료 이벤트
worker.on('exit', () => { }); 


######### w.js Child 스레드 코드 #postMessage로 전달 받은 코드
const {  parentPort } = require('worker_threads');
parentPort.on('message',(value)=>{

    const wakeUpTime = Date.now() + value*1;
    
     while (Date.now() < wakeUpTime) {
     }
    # 메인스레드로 메시지 전달
    parentPort.postMessage("DDDDDDD"); 

    parentPort.close();
})

######### w2.js Child 스레드 코드 #workerData로 전달 받은 코드
const { workerData, parentPort } = require('worker_threads');

const data = workerData; 

const wakeUpTime = Date.now() + data.count*1;

while (Date.now() < wakeUpTime) {
}
# 메인스레드로 메시지 전달
parentPort.postMessage("DDDDDDD"); 

parentPort.close();
반응형

'node.js & nginx' 카테고리의 다른 글

React + IIS + Node.js  (0) 2023.08.07
7. Nginx 로드밸런싱  (0) 2023.05.19
5. Nginx reverse proxy 설정  (0) 2023.05.18
4. 배포 및 pm2 서비스 등록  (0) 2023.05.17
3. Node.js 설치 방법 3가지  (0) 2023.05.17

댓글