- 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');
const {listeners} = require('process');
const myEvent = new EventEmitter();
myEvent.addListener('event1', () => {
console.log('event1');
});
myEvent.on('event2', () => {
console.log('event2');
});
myEvent.on('event2', consoleEvent2_2);
myEvent.once('event3', () => {
console.log('add event2.1');
});
myEvent.emit('event1');
myEvent.emit('event2');
myEvent.emit('event3');
myEvent.emit('event3');
myEvent.removeAllListeners('event1');
myEvent.emit('event1');
myEvent.removeListener('event2', consoleEvent2_2);
console.log(myEvent.listenerCount('event2'));
- 브라우저의 addEventListener처럼 이벤트를 등록해놓을 수가 있으며 이벤트가 호출됐을 때 특정 동작을 실행할 수 있다.
- 이벤트 패턴으로 여러 파일간 동작을 공유할 수 있음.
- A.js파일에 'event1'을 심어놓고, B.js에서 'event1'을 호출하면 A.js에서 'event1'의 콜백함수가 실행되는 형태