Its default size is 4, but it can be changed at startup time by setting the
UV_THREADPOOL_SIZE
environment variable to any value (the absolute maximum is 1024). - libuv docs
UV_THREADPOOL_SIZE
값이 thread pool 내의 thread 개수를 의미한다.
기본적으로 4로 설정되어있다.
.js 파일 내에서 값을 할당하는 것은 없고 nodejs 가 실행되는 EntryPoint에서 바로 지정해줘야한다.
$ env:UV_THREADPOOL_SIZE=<value>
$ node test.js
$ export UV_THREADPOOL_SIZE <value>
$ node test.js
CPU 또는 I/O intensive 한 작업에 내부적으로 쓰인다.
(개발자가 직접 컨트롤하지 않아도)
nodejs eventloop 에서 처리하기에 무거운 작업이 자동으로 thread pool 내의 thread 에 위임된다.
ex) 'crypto' 모듈의 해시함수 연산, 기타 'fs' 모듈 파일 관련 작업
아래 코드를 UV_THREADPOOL_SIZE
값을 바꿔가며 실행해보자.
import {pbkdf2} from 'crypto'
import * as process from 'process'
console.log('worker thread number is : ' + process.env.UV_THREADPOOL_SIZE)
console.time('Hashing1')
pbkdf2('a', 'b', 100_000, 512, 'sha512', ()=>{
console.timeEnd('Hashing1')
})
console.time('Hashing2')
pbkdf2('a', 'b', 100_000, 512, 'sha512', ()=>{
console.timeEnd('Hashing2')
})
console.time('Hashing3')
pbkdf2('a', 'b', 100_000, 512, 'sha512', ()=>{
console.timeEnd('Hashing3')
})
console.time('Hashing4')
pbkdf2('a', 'b', 100_000, 512, 'sha512', ()=>{
console.timeEnd('Hashing4')
})
console.time('Hashing5')
pbkdf2('a', 'b', 100_000, 512, 'sha512', ()=>{
console.timeEnd('Hashing5')
})
worker thread number is : undefined
Hashing3: 351.294ms
Hashing4: 361.309ms
Hashing1: 366.053ms
Hashing2: 371.932ms
Hashing5: 658.325ms
기본값이 4개기 때문에 총 1~4번 해싱작업은 동시에 처리되고 5번은 이후에 쓰레드가 할당되어 처리한 것을 알 수 있다.
# 쓰레드풀 사이즈 5 지정
$env:UV_THREADPOOL_SIZE=5
worker thread number is : 5
Hashing4: 318.785ms
Hashing5: 328.197ms
Hashing2: 329.408ms
Hashing1: 347.599ms
Hashing3: 360.894ms
쓰레드풀 5개를 모두 사용하여 5개 해싱작업이 동시에 이뤄졌다.