Node.js - threadpool, custom event

ryan·2022년 5월 8일
0

threadpool

  • Node는 싱글 스레드로 다수의 클라이언트를 동시에 처리하기 위해 두가지 유형의 스레드를 제공하는데 하나는 event loop 또 다른 하나가 threadpool(worker pool)이다.
  • 그 중 threadpool은 I/O(input/output)과 같은 무거운 작업을 처리하기 위해 존재한다.
    • ex) I/O 집약적 작업 : DNS, fs / CPU 집약적 작업 : crypto, zlib
  • 하지만 백그라운드에서 모듈을 무한정으로 동시에 실행할 수는 없으며 노드에서는 기본적으로 4개의 모듈을 Threadpool에서 동시에 실행한다.
    • node 명령어 SET UV_THREADPOOL_SIZE=8로 동시에 실행하는 모듈을 늘릴 수 있다.
test
const crpyto = require('crypto');
const pass = 'pass';
const salt = 'salt';
const start = Date.now();
crpyto.pbkdf2(pass, salt, 1_000_000, 128, 'sha512', () => {
  console.log(1, Date.now() - start);
  
  .
  .
  .
  8개를 동시에 node로 실행해보면 4개씩 모듈이 묶여서 실행되는 것을 확인할 수 있다. 
});

Custom Event

예저
const EventEmitter = require('events'); // EventEmitter라는 생성자 생성
const {listeners} = require('process');

const myEvent = new EventEmitter(); // 나만의 커스텀 이벤트 생성

myEvent.addListener('event1', () => { // 이벤트 추가
  console.log('event1');
});

myEvent.on('event2', () => { // on === addListener
  console.log('event2');
});

myEvent.on('event2', consoleEvent2_2); // 같은 이벤트에 콜백을 추가할 수 있다.

myEvent.once('event3', () => { // once : 이벤트가 한 번만 실행된다.
  console.log('add event2.1');
});

myEvent.emit('event1');
myEvent.emit('event2');
myEvent.emit('event3');
myEvent.emit('event3'); // error once메서드는 이벤트를 한 번만 실행

myEvent.removeAllListeners('event1'); // event1의 모든 이벤트(콜백) 삭제

myEvent.emit('event1'); // error

myEvent.removeListener('event2', consoleEvent2_2); // 모든 이벤트가 특정 이벤트를 삭제할 수 있음. 

console.log(myEvent.listenerCount('event2')); // 이벤트에 콜백함수가 몇개 등록되어 있는지 확인
  • 브라우저의 addEventListener처럼 이벤트를 등록해놓을 수가 있으며 이벤트가 호출됐을 때 특정 동작을 실행할 수 있다.
  • 이벤트 패턴으로 여러 파일간 동작을 공유할 수 있음.
    • A.js파일에 'event1'을 심어놓고, B.js에서 'event1'을 호출하면 A.js에서 'event1'의 콜백함수가 실행되는 형태
profile
프론트엔드 개발자

0개의 댓글