스레드 풀 알아보기
비동기식 메서드들은 백그라운드에서 실행되고, 실행된 후에는 다시 메인 스레드의 콜백 함수나 프로미스의 then 부분이 실행됩니다. 이때 fs 메서드를 여러 번 실행해도 백그라운드에서 동시에 처리되는데, 바로 스레드풀이 있기 때문입니다.
fs 외에도 내부적으로 스레드 풀을 사용하는 모듈로는 crypto, zlib, dns.lookup 등이 있습니다.
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);
});
콘솔
$ node threadpool
2: 2688
1: 2747
4: 2760
3: 2766
6: 5234
5: 5266
8: 5294
7: 5307
실행할 때마다 시간과 순서를 달라집니다. 스레드 폴이 작업을 동시에 처리하므로 여덟 개의 작업 중에서 어는 것이 먼저 처리될지 모릅니다. 하지만 하나의 규칙을 발견할 수는 있습니다. 1~4와 5~8이 그룹으로 묶여져 있고, 5~8명이 1~4보다 시간이 더 소요됩니다. 바로 기본적인 스레드의 개수가 네 개이기 때문입니다. 스레드 풀이 네 개이므로 처음 네 작업이 동시에 실행되고, 그것들이 종료되면 다음 네 개이기 때문입니다. 만약, 컴퓨터의 코어 개수가 4보다 작다면 다른 결과가 생길 수는 있습니다.

스레드풀을 직접 컨트롤할 수는 없지만 개수를 조절할 수는 있습니다.
윈도라면 명령 프롬프트에 SET UV_THREADPOOL_SIZE = 1을, 맥과 리눅스라면 터미널에 UV_THREADPOOL_SIze = 1을 입력한 후 다시 node threadpool 명령어를 입력해보세요. 작업이 순서대로 실행될 것입니다. 스레드폴 개수를 하나로 제한했으므로 작업이 한 번에 하나씩밖에 처리되지 않습니다. SET_UV_THREADPOOL_SIZE = 숫자와 같은 것은 process.env.UV_THREADPOOL_SIZE 를 설정하는 명령어입니다.
스레드의 개수를 8로 두면 다른 결과가 발생할 것입니다. 다만 숫자를 크게 할 때는 자신의 컴퓨터 코어 개수와 같거나 많게 두어야 뚜렷한 효과가 발생합니다.
'프로그래밍 언어 > NODE JS' 카테고리의 다른 글
| 예외 처리하기 (0) | 2025.05.10 |
|---|---|
| 이벤트 이해하기 (0) | 2025.05.07 |
| 기타 fs 메서드 알아보기 (0) | 2025.05.01 |
| 버퍼와 스트림 이해하기 (0) | 2025.04.28 |
| 동기 메서드와 비동기 메서드 (0) | 2025.04.26 |