Web Worker는 HTML5에서 제공하는 자바스크립트 멀티스레딩 솔루션입니다. 사용자 인터페이스를 중단하지 않고도 웹 작업자에게 계산 집약적인 코드를 실행할 수 있습니다. 이번 글에서는 주로 HTML5 Web Worker의 사용법을 소개하고 있는데, 편집자는 꽤 좋다고 생각해서 공유하고 참고하겠습니다. 편집자를 따라 살펴보겠습니다. 모두에게 도움이 되기를 바랍니다.
1: Worker 사용 방법
Web Worker의 기본 원칙은 Worker 클래스를 사용하여 현재 javascript의 메인 스레드에 javascript 파일을 로드하여 새 스레드를 여는 것인데, 이는 비차단 효과가 있습니다. 실행하고 메인 스레드와 새 스레드 간의 데이터 교환을 위한 인터페이스인 postMessage, onmessage를 제공합니다.
사용 방법에 대한 예를 살펴보겠습니다.
//worker.js onmessage =function (evt){ var d = evt.data;//通过evt.data获得发送来的数据 postMessage( d );//将获取到的数据发送会主线程 }
HTML 페이지: test.html
<!DOCTYPE HTML> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> <script type="text/javascript"> //WEB页主线程 var worker =new Worker("worker.js"); //创建一个Worker对象并向它传递将在新线程中执行的脚本的URL worker.postMessage("hello world"); //向worker发送数据 worker.onmessage =function(evt){ //接收worker传过来的数据函数 console.log(evt.data); //输出worker发送来的数据 } </script> </head> <body></body> </html>
Chrome 브라우저로 test.html을 연 후 콘솔 출력 "hello world"는 프로그램을 나타냅니다. 실행 성공.
이 예제를 통해 웹 워커 사용은 주로 다음 부분으로 나누어져 있음을 알 수 있습니다
WEB 메인 스레드:
1. 워커 = new Worker( url )를 통해 JS 파일을 로드하여 워커를 생성하고 워커 인스턴스를 반환합니다. .
2. Worker.postMessage(data) 메서드를 통해 작업자에게 데이터를 보냅니다.
3. 작업자가 보낸 데이터를 수신하려면 작업자.onmessage 메서드를 바인딩하세요.
4. Worker.terminate()를 사용하여 작업자 실행을 종료할 수 있습니다.
Worker 새 스레드:
1. postMessage(data) 메서드를 통해 메인 스레드로 데이터를 보냅니다.
2. 메인 스레드에서 보낸 데이터를 수신하려면 onmessage 메서드를 바인딩하세요.
두 번째: Worker는 무엇을 할 수 있나요
이제 Web Worker 사용법을 알았으니 Web Worker의 용도는 무엇이며 이러한 문제를 해결하는 데 도움이 될 수 있습니까? 피보나치 수열의 예를 살펴보겠습니다.
수학에서 피보나치 수열은 F0=0, F1=1, Fn=F(n-1)+F(n-2) (n>=2, n∈N* )과 같이 재귀적으로 정의된다는 것을 누구나 알고 있습니다. 일반적으로 사용되는 JavaScript 구현은 다음과 같습니다.
var fibonacci =function(n) { return n <2? n : arguments.callee(n -1) + arguments.callee(n -2); }; //fibonacci(36)
Chrome에서 이 방법을 사용하여 39의 피보나치 수열을 수행하는 데는 19097밀리초가 걸리며, 40을 계산할 시간이 되면 브라우저는 스크립트가 사용 중이라는 메시지를 직접 표시합니다.
JavaScript는 단일 스레드에서 실행되기 때문에 브라우저는 시퀀스를 찾는 과정에서 다른 JavaScript 스크립트를 실행할 수 없으며 UI 렌더링 스레드도 일시 중지되어 브라우저가 좀비 상태에 들어가게 됩니다. 웹 작업자를 사용하여 시퀀스의 계산 프로세스를 새 스레드에 넣으면 이러한 상황을 피할 수 있습니다. 구체적으로 예를 살펴보십시오.
//fibonacci.js var fibonacci =function(n) { return n <2? n : arguments.callee(n -1) + arguments.callee(n -2); }; onmessage =function(event) { var n = parseInt(event.data, 10); postMessage(fibonacci(n)); };
HTML 페이지: fibonacci.html
<!DOCTYPE HTML> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> <title>web worker fibonacci</title> <script type="text/javascript"> onload =function(){ var worker =new Worker('fibonacci.js'); worker.addEventListener('message', function(event) { var timer2 = (new Date()).valueOf(); console.log( '结果:'+event.data, '时间:'+ timer2, '用时:'+ ( timer2 - timer ) ); }, false); var timer = (new Date()).valueOf(); console.log('开始计算:40','时间:'+ timer ); setTimeout(function(){ console.log('定时器函数在计算数列时执行了', '时间:'+ (new Date()).valueOf() ); },1000); worker.postMessage(40); console.log('我在计算数列的时候执行了', '时间:'+ (new Date()).valueOf() ); } </script> </head> <body> </body> </html>
Chrome에서 fibonacci.html을 열면 콘솔에 다음과 같은 출력이 표시됩니다.
계산 시작: 40 시간: 1316508212705
나는 오전입니다. 계산 실행 시간: 1316508212734
시퀀스 계산 시 타이머 함수 실행 시간: 1316508213735
결과: 102334155 시간: 1316508262820 시간: 50115
이 예는 작업자에서 실행된 피보나치 수열 계산이 메인에 영향을 미치지 않음을 보여줍니다. 스레드의 코드 실행은 자체 독립 스레드에서 완전히 계산되며 결과는 계산이 완료된 후에만 메인 스레드로 다시 전송됩니다.
웹 워커를 사용하면 페이지 표시에 영향을 주지 않고 프런트 엔드에서 일부 복잡하고 대규모 작업을 수행할 수 있으며 역겨운 스크립트 사용 중 프롬프트가 팝업되지 않습니다.
다음 예에서는 웹 작업자를 사용하여 장면의 픽셀을 계산합니다. 장면이 열리면 작업자는 하나의 픽셀 값만 계산합니다.
세 가지: Worker의 다른 시도
우리는 Worker가 URL을 수신하여 워커를 생성한다는 것을 이미 알고 있으므로 웹 워커를 사용하여 jsonp와 같은 요청을 할 수 있습니까? jsonp가 스크립트 태그 JSON을 삽입하여 생성된다는 것은 누구나 알고 계시나요? 데이터가 로드되고 스크립트 요소가 로드 및 실행 중에 차단됩니다. 웹 작업자를 사용하여 비동기 로드를 구현할 수 있다면 좋을 것입니다.
다음 예에서는 웹 작업자, jsonp 및 ajax의 세 가지 방법을 통해 169.42KB JSON 데이터를 로드합니다.
// /aj/webWorker/core.js function $E(id) { return document.getElementById(id); } onload =function() { //通过web worker加载 $E('workerLoad').onclick =function() { var url ='http://js.wcdn.cn/aj/mblog/face2'; var d = (new Date()).valueOf(); var worker =new Worker(url); worker.onmessage =function(obj) { console.log('web worker: '+ ((new Date()).valueOf() - d)); }; }; //通过jsonp加载 $E('jsonpLoad').onclick =function() { var url ='http://js.wcdn.cn/aj/mblog/face1'; var d = (new Date()).valueOf(); STK.core.io.scriptLoader({ method:'post', url : url, onComplete : function() { console.log('jsonp: '+ ((new Date()).valueOf() - d)); } }); }; //通过ajax加载 $E('ajaxLoad').onclick =function() { var url ='http://js.wcdn.cn/aj/mblog/face'; var d = (new Date()).valueOf(); STK.core.io.ajax({ url : url, onComplete : function(json) { console.log('ajax: '+ ((new Date()).valueOf() - d)); } }); }; };
HTML 페이지: /aj/webWorker/worker.html
<!DOCTYPE HTML> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> <title>Worker example: load data</title> <script src="http://js.t.sinajs.cn/STK/js/gaea.1.14.js" type="text/javascript"></script> <script type="text/javascript" src="http://js.wcdn.cn/aj/webWorker/core.js"></script> </head> <body> <input type="button" id="workerLoad" value="web worker加载"></input> <input type="button" id="jsonpLoad" value="jsonp加载"></input> <input type="button" id="ajaxLoad" value="ajax加载"></input> </body> </html>
HOST 설정
127.0.0.1 js.wcdn.cn
http://js.wcdn.cn/aj/webWorker/worker.html을 통해 페이지에 액세스한 다음 세 가지 방법으로 데이터를 로드하여 콘솔 출력을 얻습니다.
web worker: 174 jsonp: 25 ajax: 38
여러 번 시도한 결과 jsonp와 ajax를 통해 데이터를 로드하는 시간이 크게 다르지 않다는 것을 알았고, 웹 워커의 로딩 시간은 항상 높은 수준이었기 때문에 웹 워커를 사용하여 데이터를 로드하는 것은 여전히 상대적으로 느리다는 것을 알았습니다. 대용량 데이터의 경우에도 작업자가 새 스레드를 초기화하는 데 시간이 많이 걸릴 수 있습니다. 로딩 중 논블로킹이 되는 것 외에는 장점이 없습니다.
그렇다면 웹 워커가 크로스 도메인 js 로딩을 지원할 수 있을까요? 이번에는 http://127.0.0.1/aj/webWorker/worker.html을 통해 페이지에 접속하면, "웹 워커 로딩" 로딩 버튼이 있습니다. Chrome에는 아무것도 없습니다. FF6에서는 어떤 반사라도 오류 메시지를 표시합니다. 이를 통해 우리는 웹 작업자가 JS의 도메인 간 로딩을 지원하지 않는다는 것을 알 수 있습니다. 이는 정적 파일을 별도의 정적 서버에 배포하는 웹 사이트에 나쁜 소식입니다.
따라서 Web Worker는 동일한 도메인에서 json 데이터를 로드하는 데만 사용할 수 있지만 ajax는 이미 이 작업을 수행할 수 있으며 더 효율적이고 다재다능합니다. 작업자가 잘하는 일을 하게 하세요.
4: 요약
웹 워커는 멋져 보이지만 악마로 가득 차 있습니다.
우리가 할 수 있는 일:
1. 메인 프로세스를 중단하지 않고 다수의 복잡한 계산을 수행하기 위해 JS를 로드할 수 있으며 postMessage, onmessage를 통해 통신할 수 있습니다.
2. 작업자 스크립트 파일
3, setTimeout(), setInterval() 및clearInterval()을 사용할 수 있습니다.
4 XMLHttpRequest를 사용하여 navigator
의 일부 속성에 액세스할 수 있습니다. 제한 사항은 무엇입니까?
1. JS는 도메인 간에 로드할 수 없습니다
2. 작업자의 코드는 DOM에 액세스할 수 없습니다
3. 예를 들어 FF에서는 새 작업을 생성할 수 있습니다. 아니요
4. 모든 브라우저가 이 새로운 기능을 지원하는 것은 아닙니다.
관련 권장 사항:
위 내용은 HTML5 Web Worker 사용 예제 튜토리얼의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!