최근에는 웹 애플리케이션에서 많은 양의 작업을 동시에 처리해야 하는 경우가 많습니다. 이런 상황에서 멀티 쓰레딩은 작업을 효율적으로 분산시켜 처리할 수 있는 좋은 방법입니다.
하지만 자바스크립트는 싱글 쓰레드 언어이기 때문에 멀티 쓰레딩을 직접 지원하지 않습니다. 그러나 미들웨어를 사용하여 비슷한 효과를 얻을 수 있습니다.
Web Workers를 활용한 멀티 쓰레딩
웹 브라우저가 제공하는 Web Workers는 백그라운드에서 동작하는 별도의 쓰레드를 생성하여 작업을 처리할 수 있게 해줍니다. 이를 활용하면 자바스크립트에서 멀티 쓰레딩을 구현할 수 있습니다.
예를 들어, 피보나치 수열을 계산하는 작업을 멀티 쓰레딩으로 처리하려면 다음과 같은 코드를 작성할 수 있습니다.
// 워커 스크립트 파일(worker.js)
self.onmessage = function(event) {
var n = event.data;
var result = fibonacci(n);
self.postMessage(result);
}
function fibonacci(n) {
if (n <= 1) {
return n;
}
return fibonacci(n - 1) + fibonacci(n - 2);
}
// 메인 스크립트 파일(main.js)
var worker = new Worker('worker.js');
worker.onmessage = function(event) {
var result = event.data;
console.log(result);
}
worker.postMessage(10);
위의 예제 코드에서는 웹 워커 스크립트 파일(worker.js)에서 피보나치 수열 계산을 수행하고, 메인 스크립트 파일(main.js)에서 워커를 생성하고 결과를 받아와서 출력합니다. 웹 워커를 사용하면 멀티 쓰레딩을 흉내내어 작업을 비동기적으로 처리할 수 있습니다.
진행상황 모니터링
멀티 쓰레딩을 활용하여 작업을 처리할 때, 작업의 진행 상황을 모니터링하는 것 역시 중요합니다. 이를 위해 자바스크립트에서는 간단한 방법을 제공합니다.
예를 들어, 위의 피보나치 수열 계산 예제에서 워커에서 작업이 진행되는 동안 메인 스크립트에서는 진행 상황을 확인하기 위해 postMessage와 onmessage를 사용하여 상태를 주고받을 수 있습니다.
// 워커 스크립트 파일(worker.js)
self.onmessage = function(event) {
var n = event.data;
var result = fibonacci(n);
self.postMessage(result);
}
function fibonacci(n) {
if (n <= 1) {
return n;
}
var a = 0, b = 1, temp;
for (var i = 2; i <= n; i++) {
temp = a + b;
a = b;
b = temp;
// 작업 진행 상황 전송
self.postMessage({ progress: i / n });
}
return b;
}
상태를 주고받는 것을 통해 워커의 작업 진행 상황을 메인 스크립트에서 모니터링할 수 있습니다.
결론
자바스크립트는 싱글 쓰레드 언어이지만, 웹 브라우저에서 제공하는 Web Workers를 활용하여 멀티 쓰레딩을 흉내낼 수 있습니다. 이를 통해 많은 양의 작업을 효율적으로 분산시켜 처리할 수 있습니다. 또한, 작업의 진행 상황을 모니터링하여 사용자에게 보다 나은 사용자 경험을 제공할 수 있습니다.
#webdevelopment #javascript