본문 바로가기

Programming/Node.js

4. Node 기능 살펴보기 (4) - 노드 내장 모듈 9 [worker_threads] 3

node js logo image

 

 

 

앞의 아티클까지 살펴본 메인/워커 스레드 사용 방식을 조금 더 응용하여, 더 복잡한 내용을 다루어보도록 하겠습니다. 꽤 어려운 내용이 될 것이니 감안하고 읽어나가시기 바랍니다. 

 

우선, 소수(prime number)가 몇 개나 있는지 개수를 구하는 작업을 진행해 보겠습니다. 일단은 워커 스레드를 사용하지 않고 싱글 스레드 방식으로 구현해 보겠습니다. 

 

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
*/

 

 

위의 식은 다소 복잡해 보이지만, 차근차근 살펴보면 이해할 수 있습니다. 기본적으로 소수(prime number)는 1과 자기 자신만으로 나누어 떨어지는 수를 의미하죠? 그러므로 for문을 통해서 우선 2부터 시작해 10000000까지의 숫자를 중첩 for문을 이용해 검증합니다.

 

즉, i라는 숫자를 j로 나누었을 때 i 자신과 동일한 수 이외의 j로 나누었을 때 0이 나오면 해당 수는 소수가 아니기 때문에 false로 처리하는 것이죠. 그리고 break로 중첩 for문을 빠져나오고 if문을 지나 isPrime = true;에 도달합니다. 그리고 i는 다음 수를 동일한 방식으로 검증합니다. 

 

이런 과정을 거칠 때 만일 해당 수가 소수여서 자기 자신 외에 나누어 떨어지는 수가 없었다면? 중첩 for문은 끝까지 진행됩니다. 그럼 isPrime은 true인 상태에서 변화가 없으므로 primes.push(i)를 통해 해당 수는 소수로 포함되고 다음 수를 검증하게 되는 것이죠.

 

해당 과정은 짧게는 3초, 길게는 10초까지 수행되는 아주 복잡한 작업입니다. 이제 이를 워커 스레드를 사용해 구현할 수 있는지 살펴보겠습니다.