프로그래밍 언어/NODE JS

스레드 풀 알아보기

· 코딩마이데이

비동기식 메서드들은 백그라운드에서 실행되고, 실행된 후에는 다시 메인 스레드의 콜백 함수나 프로미스의 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