노드 스레드풀과 커스텀 이벤트
fs, crypto, zlib 모듈의 메서드를 실행할 때는 백그라운드에서 동시에 실행된다.
- 스레드풀이 동시에 처리해준다.
스레드풀이 동시에 처리해주는 것을 보려면 crypto 같은 연산이 필요한 작업으로 확인하는 것이 좋다.
//threadpool.js
const crypto = require('crypto');
const pass = 'pass';
const salt = 'salt';
const start = Date.now();
crypto.pbkdf2(pass, salt, 1000000, 128, 'sha512', () => {
console.log('1:', Date.now() - start);
});
crypto.pbkdf2(pass, salt, 1000000, 128, 'sha512', () => {
console.log('2:', Date.now() - start);
});
crypto.pbkdf2(pass, salt, 1000000, 128, 'sha512', () => {
console.log('3:', Date.now() - start);
});
crypto.pbkdf2(pass, salt, 1000000, 128, 'sha512', () => {
console.log('4:', Date.now() - start);
});
crypto.pbkdf2(pass, salt, 1000000, 128, 'sha512', () => {
console.log('5:', Date.now() - start);
});
crypto.pbkdf2(pass, salt, 1000000, 128, 'sha512', () => {
console.log('6:', Date.now() - start);
});
crypto.pbkdf2(pass, salt, 1000000, 128, 'sha512', () => {
console.log('7:', Date.now() - start);
});
crypto.pbkdf2(pass, salt, 1000000, 128, 'sha512', () => {
console.log('8:', Date.now() - start);
});
crypto는 실행되면 백그라운드로 보내지고 백그라운드에서는 동시 실행된다는 사실을 잊지 말자.
동시에 출력이 된 것으로 보이지만 실제로 해보면 그룹이 나누어 지는 것을 볼 수 있다.
처음 4개가 주르륵 출력되고 다음에 4개가 출력되는 것을 볼 수 있는데 이는 노드는 기본적으로 4개씩 동시에 돌린다는 것을 확인 할 수 있다.
다만 이런건
윈도우에서는 : SET UV_THREADPOOL_SIZE
맥에서는 : UV_THREADPOOL_SIZE
등으로 한번에 작동할 스레드의 개수를 조절할 수 있다.
*본인 컴퓨터 사양에 맞게 잘 조절해서 쓰는 것이 좋다.
이벤트
이벤트를 만들 수 있다.
//event.js
const EventEmitter = require('events');
const myEvent = new EventEmitter();
myEvent.addListener('event1', () => {
console.log('이벤트 1');
});
myEvent.on('event2', () => {
console.log('이벤트 2');
});
myEvent.on('event2', () => {
console.log('이벤트 2 추가');
});
myEvent.once('event3', () => {
console.log('이벤트 3');
}); // 한 번만 실행됨
myEvent.emit('event1'); // 이벤트 호출
myEvent.emit('event2'); // 이벤트 호출
myEvent.emit('event3');
myEvent.emit('event3'); // 실행 안 됨
myEvent.on('event4', () => {
console.log('이벤트 4');
});
myEvent.removeAllListeners('event4');
myEvent.emit('event4'); // 실행 안 됨
const listener = () => {
console.log('이벤트 5');
};
myEvent.on('event5', listener);
myEvent.removeListener('event5', listener);
myEvent.emit('event5'); // 실행 안 됨
console.log(myEvent.listenerCount('event2'));
EventEmitter() 생성자 함수를 통해 myEvent라는 여러가지 커스텀 이벤트를 만들었다.
emit함수를 통해 생성한 이벤트를 호출했다.
출력문은 다음과 같다
이벤트 1과 2의 경우에는 호출할 때마다 출력된다. 이벤트 2의 경우 2개의 이벤트가 등록이 된 것을 볼 수 있다.
이벤트 3는 once를 사용했기 때문에 한 번만 출력되고 다음에는 출력이 되지 않는다.
removeListeners를 통해 이벤트 4에 있는 모든 함수를 지웠다. 즉, removeListeners(콜백) 을 통해 해당 함수에 있는 모든 함수들이 지워진다.
만약 하나만 지우고 싶다고 하면 removeListener(이벤트 이름 ,지우고 싶은 함수)를 사용하면 된다.
이벤트 4와 5를 지웠기 때문에 호출했을때 출력이 되지 않았다.
listenerCount(이벤트 이름)을 통해 해당 이벤트가 몇 개가 있는지 확인할 수 있다.