앞서서 워커 스레드를 사용해 보기 위한 예제로, 2부터 10000000 사이의 숫자 중 소수(prime number)를 구하는 코드를 만들어 보았습니다. 중첩 for문을 활용한 예제였는데, 이제 이것을 스레드를 활용하여 구현해 보도록 하겠습니다.
const min = 2;
const max = 10000000;
const primes = [];
function findPrimes(start, range) {
let isPrime = true;
const end = start + range;
for (let i = start; i < end; i++) {
for (let j = min; j < Math.sqrt(end); j++) {
if (i !== j && i % j === 0){
isPrime = false;
break;
}
}
if (isPrime) {
primes.push(i);
}
isPrime = true;
}
}
console.time('prime');
findPrimes(min, max);
console.timeEnd('prime');
console.log(primes.length);
/* 출력
prime: 3.393s
664579
*/
const { Worker, isMainThread, parentPort, workerData } = require('worker_threads');
const min = 2;
let primes = [];
function findPrimes(start, range) {
let isPrime = true;
const end = start + range;
for (let i = start; i < end; i++){
for (let j = min; i < Math.sqrt(end); j++){
if (i !== j && i % j ===0){
isPrime = false;
break;
}
}
if (isPrime) {
primes.push(i);
}
isPrime = true;
}
}
if (isMainThread) {
const max = 10000000;
const threadCount = 8; // 8개의 스레드가 일을 나눠 처리하도록
const threads = new Set();
const range = Math.floor( (max - min) / threadCount);
let start = min;
console.time('prime');
for (let i = 0; i < threadCount - 1; i++) {
const wStart = start;
threads.add(new Worker(__filename, { workerData: { start: wStart, range } }));
start += range;
// console.log(i , 'start :', start);
}
threads.add(new Worker(__filename, { workerData: { start, range: max - start } }));
for (let worker of threads) {
worker.on('error', (err) => {
throw err;
});
worker.on('exit', () => {
threads.delete(worker);
if (threads.size === 0) {
console.timeEnd('prime');
console.log(primes.length);
}
});
worker.on('message', (msg) => {
primes = primes.concat(msg);
});
}
} else {
findPrimes(workerData.start, workerData.range);
parentPort.postMessage(primes);
}
'Programming > Node.js' 카테고리의 다른 글
4. Node 기능 살펴보기 (5) - 파일 시스템 접근하기 [fs] 1 (0) | 2024.05.08 |
---|---|
4. Node 기능 살펴보기 (4) - 노드 내장 모듈 10 [child_process] (0) | 2024.05.07 |
4. Node 기능 살펴보기 (4) - 노드 내장 모듈 9 [worker_threads] 3 (0) | 2024.05.02 |
4. Node 기능 살펴보기 (4) - 노드 내장 모듈 9 [worker_threads] 2 (0) | 2024.05.01 |
4. Node 기능 살펴보기 (4) - 노드 내장 모듈 9 [worker_threads] 1 (0) | 2024.04.30 |