본문 바로가기

Study/HTML5,CSS,JQuery

[HTML5/CSS3/JQUERY] web worker

WEB WORKER

자바스크립트 코드를 백그라운드에서 실행시키기 위한 기술

백그라운드에서 실행되는 코드를 '워커'라 부르며, DOM과는 완전히 분리된 환경에서 동작한다.

현재 웹 브라우저는 기본적으로 웹 페이지를 하나의 스레드로 실행한다.

자바 스크립트의 모든 작업을 모두 같은 하나의 스레드로 작업하게 되면 UI작업이 끝날 때까지 화면이 멈춰 있게 된다.

이런 현상을 개선할 때 WEB WORKER를 사용한다.

 

목적에 따라 사용할 수 있는 2가지의 워커가 규정되어 있다.

1. 워커 객체와 백그라운드 프로세스가 1:1로 대응하는 모델

2. 여러 개의 객체가 하나의 백그라운드 프로세스를 공유하는 모델(공유워커)

 

워커는 DOM을 조작할 수 없다.(WINDOW나 DOCUMENT 등 브라우저에서 자바스크립트로 접근할 수 없다.)

UI와 WORKER 간에는 postMessage()를 통해서 서로 데이터를 주고 받고, 비동기로 데이터를 공유한다.

 

워커 생성

var worker = new Worker(불러 올 JS파일);

워커에 대해 메시지 보내기

worker.postMessage(보낼 메시지);

워커에서 워커를 생성한 곳으로 메시지 보내기

onmessage = function() { ... }

 

 METHOD

 설명

 onerror

 에러 포착 이벤트 핸들러 

 terminate()

 강제 종료 

 postMessage(msg, [ports])

 메시지 송신 

 onmessage

 메시지 수신 이벤트 핸들러 

 

 

workerTest1.html

- 이 테스트는 opera에서 보는 게 좋다.

<!DOCTYPE html> 
<html> 
<head> 
<meta charset="UTF-8"> 
<title>Insert title here</title> 
<!-- <script type="text/javascript" src="js/jquery-1.8.1.min.js"></script> --> 
<script type="text/javascript" src="http://code.jquery.com/jquery-1.7.2.min.js"></script> 
<script type="text/javascript"> 
    $(function() { 
        // 워커를 지원하는 지 안하는 지 검사 
        if (typeof(Worker) == "undefined") { 
            alert("Web Worker를 지원하지 않습니다."); 
            return; 
        } 
         
        var worker = new Worker("worker.js");    // 워커 설정 
        $("#btnStart").click(function() { 
            $("#output").html("시작.."); 
            worker.postMessage("start");    // 워커로 메시지 전송 
        }); 
         
        $("#btnStop").click(function() { 
            worker.terminate(); 
            alert("Web Worker 작업 중지"); 
        }); 
         
        // 워커로부터 수신 
        worker.onmessage = function(e) { 
            console.log(e.data); 
            $("#output").html(e.data); 
            if (e.data == "end") { 
                alert("작업이 끝났어요."); 
            } 
        } 
         
        // 에러 발생 시 호출 
        worker.onerror = function(e) { 
            console.log(e.message); 
        } 
    }); 
</script> 
</head> 
<body> 
    <div id="output">대기</div> 
    <input type="button" id="btnStart" value="처리"> 
    <input type="button" id="btnStop" value="중지"> 
</body> 
</html>

 

worker.js

onmessage = function(e) { 
    if (e.data == "start") { 
        for (var i=0; i<=100000; i++) { 
            postMessage(i); 
        } 
    } 
    postMessage("end"); 
}

 

 

workerTest2.html

<!DOCTYPE html> 
<html> 
<head> 
<meta charset="UTF-8"> 
<title>Insert title here</title> 
<!-- <script type="text/javascript" src="js/jquery-1.8.1.min.js"></script> --> 
<script type="text/javascript" src="http://code.jquery.com/jquery-1.7.2.min.js"></script> 
<script type="text/javascript"> 
    var worker = new Worker("workerGugu.js"); 
     
    $(function() { 
        $("#btnOk").click(function() { 
            worker.postMessage($("#guguNum").val()); 
        }); 
         
        worker.onmessage = function(e) { 
            $("#result").html(e.data); 
             
        } 
    }); 
</script> 
</head> 
<body> 
    <label>구구단</label> 
    <input type="text" id="guguNum"/> 
    <input type="button" id="btnOk" value="확인"/> 
    <div id="result"></div> 
</body> 
</html>

 

workerGugu.js

onmessage = function(e) { 
    var dan = e.data; 
    var str = "["+dan+" DAN]<br/><br/>"; 
    for (var i=1; i<=9; i++){ 
        str += dan+" * "+i+" = "+(dan * i)+"<br/>"; 
    } 
    postMessage(str); 
}