🐕 스레드 풀은
스레드풀(Thread pool)은 프로그램이 동시에 처리해야 할 작업이 많은 경우,
이를 처리할 스레드를 관리하는 기법입니다.
스레드풀은 미리 정해진 개수의 스레드를 생성하고 유지함으로써,
새로운 작업이 들어올 때마다 매번 스레드를 생성하지 않고 생성된 스레드 중에서 작업을 할당하여 처리합니다.
말투가 뭔가 이상하죠 네 챗지피티입니다.그러니까 스레드 풀이란 것은 프로그램이 동시에 처리해야할 작업이 많으면이를 동시에 처리해줄 스레드도 많이 필요하겠죠?동시에 처리해야할 작업이 많으면 많을 수록 컴퓨터는스레드를 동시에 처리해야할 작업의 수만큼 생성할 것입니다.
문제는 스레드를 생성하는 것 자체도 꽤 자원이 많이 드는 일이라는 것입니다.따라서 스레드를 그때그때 필요한 만큼 생성하고 지우는 방식은매우 비효율적일 가능성이 존재 합니다.
이러한 문제를 해결하기 위해 스레드 풀이라는 기법을 도입할 수 있어요
스레드 풀은 어떻게 보면 세마포어와 비슷하게 보이기도 합니다.(제가 그렇게 생각함)
스레드 풀을 만들어서 n개 만큼의 스레드를 만들어 둔 뒤
그 스레드를 계속 사용하면 효율적이지 않을까요?
스레드 풀에 작업 처리를 요청하면
스레드 풀의 작업 큐에 순차적으로 들어가고
만약 놀고있는 스레드가 있다면 작업큐에서 하나씩 빼서 스레드에 넣어주는 방식으로 하면
아주... 효율적이다!
그리고 이벤트 루프를 공부하면서 알 수 있었지만
우리의 자바스크립트는 싱글스레드 언어이지만
자바스크립트를 구동하는 런타임 환경은 싱글스레드라고 부르기 애매하다라는 것
👻Node.js의 스레드 풀에 있는 스레드의 갯수는?
총 4개라고 합니다.
근데 실제로 우리가 4개인걸 확인하고 싶으면 어떻게 해야하나.
하면 코드를 확인할 수 있게 짜면 되겠죠?
전 허수개발자라 그걸 확인해볼 방법은 잘 모르겠어서
유튜브를 찾아 헤매다가 제로초님이 이미 하신걸 봤습니다.
여러분들도 같이 해봐요
const crypto = require('crypto')
const pass = 'pass'
const salt = 'salt'
const start = Date.now()
crypto.pbkdf2(pass, salt, 1_000_000, 128 , 'sha512' , () => {
console.log('1',Date.now() - start)
})
crypto.pbkdf2(pass, salt, 1_000_000, 128 , 'sha512' , () => {
console.log('2',Date.now() - start)
})
crypto.pbkdf2(pass, salt, 1_000_000, 128 , 'sha512' , () => {
console.log('3',Date.now() - start)
})
crypto.pbkdf2(pass, salt, 1_000_000, 128 , 'sha512' , () => {
console.log('4',Date.now() - start)
})
crypto.pbkdf2(pass, salt, 1_000_000, 128 , 'sha512' , () => {
console.log('5',Date.now() - start)
})
crypto.pbkdf2(pass, salt, 1_000_000, 128 , 'sha512' , () => {
console.log('6',Date.now() - start)
})
crypto.pbkdf2(pass, salt, 1_000_000, 128 , 'sha512' , () => {
console.log('7',Date.now() - start)
})
crypto.pbkdf2(pass, salt, 1_000_000, 128 , 'sha512' , () => {
console.log('8',Date.now() - start)
})
crypto는 자바스크립트에서 제공하는 모듈의 한 종류로
웹에서 암호화 기술을 적용할 수 있게 해주는 모듈입니다.
pbkdf2 메서드는 "Password-Based Key Derivation Function 2"의 약자로
주어진 패스워드와 salt를 기반으로 키를 생성해주는 함수에요
정확한 구동원리까지는 지금은 필요 없으니
비동기 함수이면서 꽤 무거운 연산을 하는 녀석이라고만 알고 코드를 실행해봅시다.
2 2470
4 2492
1 2786
3 2847
5 4754
6 4801
7 5019
8 5036
실제로 코드를 찍어보면
1234 그룹과 5678 그룹으로 나뉘어서 실행이 되는것을 확인할 수 있습니다.
gif파일로 만들어 올 정도의 정성은 없으니까 여러분도 복붙해서 해보세요
아무리 여러번 실행을 시켜봐도
순서와 암호화된 값은 바뀌지만 1,2,3,4 그룹과 5,6,7,8 그룹은 항상 묶여져서 나옵니다.
1,2,5,3 이런식으로 뒤죽박죽으로 나오지 않아요
어..? 그런데 제 컴퓨터는 6core인데 스레드를 4개밖에 쓰지 않는다..?
아쉽다...? 싶으면 그걸 내 컴퓨터의 코어 갯수에 맞게 스레드를 사용하게 만드는 방법도 있다고합니다.
🥶 스레드 풀의 사이즈를 늘려주는 법
UV_THREADPOOL_SIZE=8
위와 같은 명령어를 터미널에서 실행해주면 됩니다.
숫자는 조절할 수 있겠죠??
원래 윈도우에서는 저 명령어가 안먹혀서
SET UV_THREADPOOL_SIZE=8
명령어를 넣어줘야했다는데
제가 해보니 전 SET을 넣으면 안되네요
$ UV_THREADPOOL_SIZE=8 node das.js
3 4038
4 4090
6 4105
8 4135
7 4265
1 4298
2 4308
5 4337
다만 주의할점은 이렇게 설정한 스레드풀의 사이즈는
스레드풀 사이즈라는 환경변수를 새로 정의해준 터미널 환경에서만 유효하기때문에
여기서만... 사용가능하다는 점...
왜안되지하다가 챗지피티한테 물어보고 깨달았습니다.
저렇게 명령어를 실행하고나면 원래는 1234 5678로 그룹이 나뉘어서 출력되었지만
이제 완전히 뒤죽박죽으로 먼저 완료된 순서로 나오게되는걸 확인할 수가 있죠!
😋스레드풀의 최대 스레드 사이즈
https://docs.libuv.org/en/v1.x/threadpool.html#threadpool
Thread pool work scheduling — libuv documentation
Thread pool work scheduling libuv provides a threadpool which can be used to run user code and get notified in the loop thread. This thread pool is internally used to run all file system operations, as well as getaddrinfo and getnameinfo requests. Its defa
docs.libuv.org
libuv docs를 참고해보면
스레드 풀의 기본 사이즈는 4이지만 환경변수를 설정하는 것으로
우리가 위에서 실습해본 것과 같이 스레드의 수를 늘려줄 수 있었다.
버전 1.30.0에서 최대 스레드 풀 사이즈가 128에서 1024로 증가했으며
버전 1.45.0에서 스레드가 (가끔 너무 낮은 플랫폼 기본값 ) 대신 8MB의 스택을 갖게되었다.
즉 스레드풀 사이즈를 최대 1024로도 설정할 수 있다는것!!
굉장하군용
스레드 풀은 전역적이면서 모든 이벤트루프에서 공유된다고 합니다.
신비한 자바스크립트의 세계..
'javascript' 카테고리의 다른 글
계산된 속성 이름 (Computed property name) 문법을 보자 (0) | 2023.04.09 |
---|---|
async/await을 프로미스보다 맛있게 먹는 법 (0) | 2023.03.30 |
node.js 환경에서 fetch API를 사용하는 방법 (0) | 2023.03.21 |
자바스크립트 this 디스합니다. 비트주세요 (0) | 2023.03.16 |
프로미스를 회처럼 날로 먹는 방법 (3) | 2023.03.15 |