>  기사  >  웹 프론트엔드  >  HTML5_html5 튜토리얼 팁에 대한 Web Worker 사용 가이드

HTML5_html5 튜토리얼 팁에 대한 Web Worker 사용 가이드

WBOY
WBOY원래의
2016-05-16 15:46:231240검색

Web Workers는 HTML5에서 제공하는 자바스크립트 멀티스레딩 솔루션입니다. 계산 집약적인 일부 코드를 웹 작업자에게 넘겨 사용자 인터페이스를 중단하지 않고 실행할 수 있습니다.
1: 작업자 사용 방법

Web Worker의 기본 원리는 Worker 클래스를 사용하여 현재 javascript의 메인 스레드에 javascript 파일을 로드하여 새로운 스레드를 여는 것인데, 이는 논블로킹 실행 효과가 있고 메인 스레드와 메인 스레드 사이에 데이터를 제공하는 것입니다. 새로운 스레드 교환된 인터페이스: postMessage, onmessage.

사용 방법에 대한 예를 살펴보겠습니다.

JavaScript 코드클립보드에 콘텐츠 복사
  1. //worker.js
  2. onmessage =기능 (evt){
  3. var d = evt.data;//evt.data를 통해 전송된 데이터 가져오기
  4. postMessage( d );//얻은 데이터를 메인 스레드로 전송
  5. }

HTML 페이지: test.html


XML/HTML 코드클립보드에 콘텐츠 복사
  1. >  
  2. <html>  
  3. <<스팬 스타일="너비: 자동; 높이: 자동; 부동: 없음;" id="20_nwp"><a style="text- 장식: 없음;" mpid="20" 대상 ="_blank" href="http://cpro.baidu.com/ cpro/ui/uijs.php?adclass=0&app_id=0&c=news&cf=1001&ch=0&di=128&fv=0&is_app=0&jk=619521ab1ccffd45&k=head&k0=head&kdi0=0&luki=6&n=10&p=baidu&q=06011078_cpr&rb=0&rs =1&seller_id=1&sid=45fdcf1cab219561&ssp2= 1&stid=0&t=tpclicked3_hc&tu=u1922429&u=http://www.admin10000.com/document/1183.html&urlid=0" ID="20_nwl"><스팬 스타일="color:#0000ff;font-size:14px;width:auto;height:auto;float:none;">머리 스팬>a>< /스팬>>  
  4.  <메타 http-equiv=" 콘텐츠 유형" 콘텐츠="text/html;  charset=utf-8"/>   
  5.  <스크립트 유형="text/ < style="너비: auto; 높이: 자동; float: none;" id="21_nwp">< a 스타일="텍스트 장식: 없음;" mpid="21" 대상="_blank" href="http://cpro.baidu.com/cpro/ui/uijs.php?adclass=0&app_id=0&c=news&cf=1001&ch=0&di= 128&fv=0&is_app=0&jk=619521ab1ccffd45&k=javascript&k0=javascript&kdi0=0&luki=9&n=10&p=baidu&q=06011078_cpr&rb=0&rs=1&seller_id=1&sid=45fdcf1cab219561&ssp2=1&sti d=0&t=tpclicked3_hc&tu=u1922429&u=http://www.admin10000.com/document/ 1183.html&urlid=0" ID="21_nwl">< ;스팬 스타일="color:#0000ff;font-size:14px;width:auto; height:auto;float:none;">javascriptspan>>스팬>">  
  6. //WEB页主线程   
  7. var worker =new Worker("worker.js"); //创建一个Worker对象并向它传递将在新线程中执行的脚本的URL   
  8.  worker.postMessage("hello world");     //向worker发送数据   
  9.  worker.onmessage =기능(evt){     //接收worker传过来的数据 <스팬 스타일="너비: 자동; 높이: 자동; 부동: 없음 ;" id="22_nwp">< a 스타일="텍스트 장식: 없음;"  mpid="22" 대상="_blank" href="http://cpro.baidu.com/cpro/ui/uijs.php?adclass=0&app_id=0&c=news&cf=1001&ch =0&di=128&fv=0&is_app=0&jk=619521ab1ccffd45&k=����&k0=����&kdi0=0&luki=2&n=10&p=baidu&q=06011078_cpr&rb=0&rs=1&seller_id=1&sid=45fdcf1cab219561&ssp2= 1&stid=0&t=tpclicked3_hc&tu=u1922429&u=http ://www.admin10000.com/document/1183.html&urlid=0" id="22_nwl"><스팬 스타일="color:#0000ff ;font-size:14px;width:auto;height:auto;float:none;">函数 스팬>스팬>스팬>  
  10.    console.log(evt.<span style= "너비: 자동; 높이: 자동; 부동: 없음;" id="23_nwp"><a style="텍스트 장식: 없음;" mpid="23" 대상="_blank" href="http://cpro.baidu.com/cpro/ ui/uijs.php?adclass=0&app_id=0&c=news&cf=1001&ch=0&di=128&fv=0&is_app=0&jk=619521ab1ccffd45&k=data&k0=data&kdi0=0&luki=4&n=10&p=baidu&q=06011078_cpr&rb=0&rs=1& Seller_id=1&sid=45fdcf1cab219561&ssp2=1&stid= 0&t=tpclicked3_hc&tu=u1922429&u=http://www.admin10000.com/document/1183.html&urlid=0" ID= "23_nwl"><스팬 스타일="color:#0000ff;font-size:14px;width:auto;height:auto;float:none;">데이터< /스팬>a>스팬>);              //출근근로자发送来的数据   
  11.  }
  12. 스크립트>
  13. 머리>
  14. <>>
  15. html>

Chrome 브라우저로 test.html을 열면 콘솔에 "hello world"가 출력되어 프로그램 실행이 성공했음을 나타냅니다.

이 예를 통해 Web Worker의 사용은 크게 다음과 같은 부분으로 나누어져 있음을 알 수 있습니다

WEB 메인 스레드:

1. 작업자 = 새 작업자( url )를 통해 JS 파일을 로드하여 작업자를 생성하고 작업자 인스턴스를 반환합니다.

 2. 작업자.postMessage(data) 메서드를 통해 작업자에게 데이터를 보냅니다.

3. 작업자가 보낸 데이터를 받기 위해 작업자.onmessage 메서드를 바인딩합니다.

4. Worker.terminate()를 사용하여 작업자 실행을 종료할 수 있습니다.

작업자 새 스레드:

 1. postMessage(data) 메소드를 통해 메인 스레드에 데이터를 보냅니다.

 2. 메인 스레드에서 보낸 데이터를 수신하기 위해 onmessage 메소드를 바인딩합니다.
2: 근로자가 할 수 있는 일

이제 Web Worker 사용법을 알았으니, 그 용도는 무엇이며 어떤 문제를 해결하는 데 도움이 될까요? 피보나치 수열의 예를 살펴보겠습니다.

수학에서 피보나치 수열은 F0=0, F1=1, Fn=F(n-1) F(n-2) (n>=2, n∈N* ), 일반적인 자바스크립트 구현은 다음과 같습니다.

JavaScript 코드클립보드에 콘텐츠 복사
  1. var fibonacci =함수(n) {
  2. 반환 n <2? n : 인수.callee(n -1) 인수.callee(n -2);
  3. }
  4. //fibonacci(36)
Chrome에서 이 방법을 사용하면 39의 피보나치 수열을 실행하는 데 19097밀리초가 걸리지만, 40을 계산할 때 브라우저는 스크립트가 사용 중이라는 메시지를 직접 표시합니다.

JavaScript는 단일 스레드에서 실행되기 때문에 시퀀스를 계산하는 과정에서 브라우저는 다른 JavaScript 스크립트를 실행할 수 없으며 UI 렌더링 스레드도 일시 중지되어 브라우저가 좀비 상태에 들어가게 됩니다. 웹 작업자를 사용하여 시퀀스의 계산 프로세스를 새 스레드에 넣으면 이러한 상황을 피할 수 있습니다. 구체적인 예를 참조하세요.



JavaScript 코드
클립보드에 콘텐츠 복사



XML/HTML 코드
국제 코드 구성
  1. >  
  2. <html>  
  3. <<스팬 스타일="너비: 자동; 높이: 자동; 부동: 없음;" id="11_nwp"><a style="text- 장식: 없음;" mpid="11" 대상 ="_blank" href="http://cpro.baidu.com/ cpro/ui/uijs.php?adclass=0&app_id=0&c=news&cf=1001&ch=0&di=128&fv=0&is_app=0&jk=619521ab1ccffd45&k=head&k0=head&kdi0=0&luki=6&n=10&p=baidu&q=06011078_cpr&rb=0&rs =1&seller_id=1&sid=45fdcf1cab219561&ssp2= 1&stid=0&t=tpclicked3_hc&tu=u1922429&u=http://www.admin10000.com/document/1183.html&urlid=0" ID="11_nwl"><스팬 스타일="color:#0000ff;font-size:14px;width:auto;height:auto;float:none;">머리 스팬>a>< /스팬>>  
  4. <메타 http-equiv=" 콘텐츠 유형" 콘텐츠="text/html;  charset=utf-8"/>   
  5. <제목>웹 워커 피보나치 제목>  
  6. <스크립트 유형="text/ < style="너비: auto; 높이: 자동; float: none;" id="12_nwp">< a 스타일="텍스트 장식: 없음;" mpid="12" 대상="_blank" href="http://cpro.baidu.com/cpro/ui/uijs.php?adclass=0&app_id=0&c=news&cf=1001&ch=0&di= 128&fv=0&is_app=0&jk=619521ab1ccffd45&k=javascript&k0=javascript&kdi0=0&luki=9&n=10&p=baidu&q=06011078_cpr&rb=0&rs=1&seller_id=1&sid=45fdcf1cab219561&ssp2=1&sti d=0&t=tpclicked3_hc&tu=u1922429&u=http://www.admin10000.com/document/ 1183.html&urlid=0" ID="12_nwl">< ;스팬 스타일="color:#0000ff;font-size:14px;width:auto; height:auto;float:none;">javascriptspan>>스팬>">  
  7.   온로드 =기능(){   
  8.       var worker =new Worker('fibonacci.js');     
  9.       worker.addEventListener('message', function(event) {   
  10.         var timer2 = (new Date()).valueOf();   
  11.            console.log( '结果:' event.<span style ="너비: 자동; 높이: 자동; 부동: 없음;" id="13_nwp" >< 스타일=" 텍스트 장식: 없음;" mpid="13" 대상="_blank" href="http://cpro.baidu. com/cpro/ui/uijs.php?adclass=0&app_id=0&c=news&cf=1001&ch=0&di=128&fv=0&is_app=0&jk=619521ab1ccffd45&k=data&k0=data&kdi0=0&luki=4&n=10&p=baidu&q=06011078_cpr&rb=0 &rs=1&seller_id=1&sid= 45fdcf1cab219561&ssp2=1&stid=0&t=tpclicked3_hc&tu=u1922429&u=http://www.admin10000.com/document/1183.html&urlid=0" ID="13_nwl"><스팬 스타일= "color:#0000ff;font-size:14px;width:auto;height:auto;float:none;">데이터스팬>> 스팬>, '时间:'  timer2, '용时:'  ( timer2  - timer ) );   
  12.       }, 거짓);   
  13.       var 타이머 = (new Date()).valueOf();   
  14.       console.log('开始计算:40','时间:'  timer );   
  15.       setTimeout(function(){   
  16.           console.log('정时器<span style="너비: 자동; 높이: 자동; 부동: 없음;" id="14_nwp" ><a style="텍스트 장식 : 없음;" mpid="14" 대상="_blank" href="http://cpro.baidu.com/cpro /ui/uijs.php?adclass=0&app_id=0&c=news&cf=1001&ch=0&di=128&fv=0&is_app=0&jk=619521ab1ccffd45&k=����&k0=����&kdi0=0&luki=2&n=10&p=baidu&q=06011078_cpr&rb=0&rs =1&seller_id=1&sid=45fdcf1cab219561&ssp2=1&stid=0&t=tpclicked3_hc&tu=u1922429&u=http://www.admin10000.com/document/1183.html&urlid=0" id="14_nwl"><스팬 스타일="색상:#0000ff;글꼴 크기:14px;너비:자동;높이:자동;float:없음;">函数스팬>a>span>在计算数列时执行了', '时间:'  (new Date()).valueOf( ) );   
  17.       },1000);   
  18.       worker.postMessage(40);   
  19.       console.log('我在计算数列的时候执行了', '时间:'  (new Date()).valueOf() );   
  20.   }     
  21.   스크립트>  
  22. <스팬 스타일= "너비: 자동; 높이: 자동; 부동: 없음;" id="15_nwp"><a 스타일="text -장식: 없음;" mpid="15" 대상="_blank" href="http://cpro.baidu.com /cpro/ui/uijs.php?adclass=0&app_id=0&c=news&cf=1001&ch=0&di=128&fv=0&is_app=0&jk=619521ab1ccffd45&k=head&k0=head&kdi0=0&luki=6&n=10&p=baidu&q=06011078_cpr&rb=0 &rs=1&seller_id=1&sid=45fdcf1cab219561&ssp2 =1&stid=0&t=tpclicked3_hc&tu=u1922429&u=http://www.admin10000.com/document/1183.html&urlid=0" ID= "15_nwl"><스팬 스타일="color:#0000ff;font-size:14px;width:auto;height:auto;float:none;">머리스팬>a>< ;/스팬>>  
  23. <>  
  24. >  
  25. html>  

  재Chrome中打开fibonacci.html,控system台得到如下输流:
 
开始计算:40 时间:1316508212705
我䮡算数列的时候执行了 时间:1316508212734
정정时器

XML/HTML 코드复复内容到剪贴板
  1. <스팬 스타일="너비: 자동, 높이 : auto;  float: 없음;" id="9_nwp">a 스타일="텍스트 장식: 없음;" mpid="9" 대상=" _blank" href="http://cpro.baidu.com/cpro/ui/uijs.php?adclass=0&app_id =0&c=news&cf=1001&ch=0&di=128&fv=0&is_app=0&jk=619521ab1ccffd45&k=����&k0=����&kdi0=0&luki=2&n=10&p=baidu&q=06011078_cpr&rb=0&rs=1&seller_id=1&sid=45f dcf1cab219561&ssp2=1&stid=0&t =tpclicked3_hc&tu=u1922429&u=http://www.admin10000.com/document/1183.html&urlid=0" ID=" 9_nwl"><스팬 스타일="color:#0000ff;font-size:14px;width:auto;height:auto;float:none;">函数스팬>a>스팬>  
  这个例子说明은 노동자 중 하나인 피보나치의 회사에서 더 이상 사용할 수 없습니다.计算完成之后将结果发回主线程。
  利를 사용하는 웹 작업자는 이전에 우리는 더 많은 양의 데이터를 처리할 수 없었습니다.

  하단 화면에는 웹 작업자를 위한 웹 작업자의 중앙 이미지가 있습니다.

  http://nerget.com/rayjs-mt/rayjs.html

  3:Worker的其他尝试


  我们已经知道Worker통신은 URL来创建一个worker,那么我们是否可以利사용웹 작업자来做一些类似jsonp的请求呢,大家道jsonp是일반적인 스크립트标签来加载json数据的,而script元素재加载와 执行过程中道是阻塞式的,如果能利用웹 작업자实现异步加载将会不常不错。

  하단 인터페이스에는 웹 작업자, jsonp, ajax가 포함되어 있지 않으며 jsonp와 ajax는 서로 다른 방식으로 사용됩니다. 169.42KB Big Small JSON数据

 


JavaScript 코드
复复内容到剪贴板
  1. // /aj/webWorker/core.js   
  2. 기능 $E(id) {   
  3.     반환 document.getElementById(id);   
  4. }   
  5. onload =함수() {   
  6.     //通过web worker加载   
  7.     $E('workerLoad').onclick =기능() {   
  8.         var url ='http://js.wcdn.cn/aj/mblog/face2' ;   
  9.         var d = (new Date()).valueOf();   
  10.         var worker =new Worker(url);   
  11.         worker.onmessage =함수(obj) {   
  12.             console.log('web worker: '  ((new Date()).valueOf() - d));   
  13.         };   
  14.     };   
  15.     //通过jsonp加载   
  16.     $E('jsonpLoad').onclick =기능() {   
  17.         var url ='http://js.wcdn.cn/aj/mblog/face1' ;   
  18.         var d = (new Date()).valueOf();   
  19.         STK.core.io.scriptLoader({   
  20.             방법:'게시',   
  21.             url : url,   
  22.             onComplete : 함수() {   
  23.                console.log('jsonp: '  ((new Date()).valueOf() - 디));   
  24.             }   
  25.         });   
  26.     };   
  27.     //통로ajax< /span>加载   
  28.     $E('ajaxLoad').onclick =기능() {   
  29.         var url ='http://js.wcdn.cn/aj/mblog/face' ;   
  30.         var d = (new Date()).valueOf();   
  31.         STK.core.io.ajax({   
  32.             url : url,   
  33.             onComplete : 함수(json) {   
  34.                console.log('ajax: '  ((new Date()).valueOf() - 디));   
  35.             }   
  36.         });   
  37.     };   
  38. };  

  HTML 페이지:/aj/webWorker/worker.html

 

XML/HTML 코드复复内容到剪贴板
  1. >  
  2. <html>  
  3. <<스팬 스타일="너비: 자동; 높이: 자동; 부동: 없음;" id="4_nwp"><a style="text- 장식: 없음;" mpid="4" 대상 ="_blank" href="http://cpro.baidu.com/ cpro/ui/uijs.php?adclass=0&app_id=0&c=news&cf=1001&ch=0&di=128&fv=0&is_app=0&jk=619521ab1ccffd45&k=head&k0=head&kdi0=0&luki=6&n=10&p=baidu&q=06011078_cpr&rb=0&rs =1&seller_id=1&sid=45fdcf1cab219561&ssp2= 1&stid=0&t=tpclicked3_hc&tu=u1922429&u=http://www.admin10000.com/document/1183.html&urlid=0" ID="4_nwl"><스팬 스타일="color:#0000ff;font-size:14px;width:auto;height:auto;float:none;">머리 스팬>a>< /스팬>>  
  4. <메타 http-equiv=" 콘텐츠 유형" 콘텐츠="text/html;  charset=utf-8"/>   
  5. <제목>근로자 예: 로드< 스팬 스타일="너비: 자동; 높이: 자동; 부동: 없음;" id="5_nwp"><a 스타일="텍스트 장식: 없음;" mpid= "5" 대상="_blank"  href="http://cpro.baidu.com/cpro/ui/uijs.php?adclass=0&app_id=0&c=news&cf=1001&ch=0&di=128&fv=0&is_app=0&jk =619521ab1ccffd45&k=data&k0=data&kdi0=0&luki=4&n=10&p=baidu&q=06011078_cpr&rb=0&rs=1&seller_id=1&sid=45fdcf1cab219561&ssp2=1&stid=0&t=tpclicked3_hc&tu=u192 2429&u=http://www.admin10000.com/document/1183.html&urlid=0 " id="5_nwl"><스팬 스타일="color:#0000ff;font-size:14px;width:auto;height:auto;float :없음;">데이터범위>< ;/a>스팬>제목>  
  6. <스크립트 src="http: //js.t.sinajs.cn/STK/js/gaea.1.14.js" 유형="text/< ; style="너비: 자동; 높이: 자동; float: none;" id="6_nwp">< a 스타일="텍스트 장식: 없음;" mpid="6" 대상="_blank" href="http://cpro.baidu.com/cpro/ui/uijs.php?adclass=0&app_id=0&c=news&cf=1001&ch=0&di= 128&fv=0&is_app=0&jk=619521ab1ccffd45&k=javascript&k0=javascript&kdi0=0&luki=9&n=10&p=baidu&q=06011078_cpr&rb=0&rs=1&seller_id=1&sid=45fdcf1cab219561&ssp2=1&sti d=0&t=tpclicked3_hc&tu=u1922429&u=http://www.admin10000.com/document/ 1183.html&urlid=0" id="6_nwl">< ;스팬 스타일="color:#0000ff;font-size:14px;width:auto; height:auto;float:none;">javascriptspan>>스팬>">스크립트>  
  7. <스크립트 유형="text/ javascript" src="http://js.wcdn.cn/aj/webWorker/core.js" >스크립트>  
  8. 머리>  
  9. <>  
  10.     <입력 입력="버튼"  id="workerLoad" ="웹 작업자加载">입력>  
  11.     <입력 입력="버튼"  id="jsonpLoad" ="jsonp加载">입력>  
  12.     <입력 입력="버튼"  id="<span style="너비: 자동; 높이: 자동; float: none;" id="7_nwp">< a 스타일="텍스트 장식: 없음;" mpid="7" 대상="_blank" href="http://cpro.baidu.com/cpro/ui/uijs.php?adclass=0&app_id=0&c=news&cf=1001&ch=0&di= 128&fv=0&is_app=0&jk=619521ab1ccffd45&k=ajax&k0=ajax&kdi0=0&luki=8&n=10&p=baidu&q=06011078_cpr&rb=0&rs=1&seller_id=1&sid=45fdcf1cab219561&ssp2=1&sti d=0&t=tpclicked3_hc&tu=u1922429&u=http://www.admin10000.com/document/ 1183.html&urlid=0" ID="7_nwl">< ;스팬 스타일="color:#0000ff;font-size:14px;width:auto; height:auto;float:none;">ajaxspan>>스팬>로드" ="ajax加载">입력>  
  13. >  
  14. html>  

  设置HOST
 

复代码
代码如下:
127.0.0.1 js .wcdn.cn 

  通过 http://js.wcdn.cn/aj/webWorker/worker.html 访问页face然后分别通过三种方式加载数据,得到控 제조사台输출:
 

复代码
代码如下:
웹 작업자: 174
jsonp: 25
ajax: 38

여러 번 시도한 결과 jsonp와 ajax를 통해 데이터를 로드하는 시간은 크게 다르지 않으며 Web Worker의 로딩 시간은 항상 높은 수준이어서 Web Worker를 사용하여 데이터를 로드하는 것은 여전히 ​​상대적입니다. 느리고, 데이터 양이 많아도 장점이 없습니다. Worker가 새 스레드를 초기화하는 데 시간이 걸릴 수 있습니다. 로딩 중 논블로킹이 되는 것 외에는 장점이 없습니다.

그러면 웹 작업자가 도메인 간 js 로딩을 지원할 수 있습니까? 이번에는 http://127.0.0.1/aj/webWorker/worker.html을 통해 페이지에 액세스합니다. "웹 작업자 로딩" 로딩 버튼을 클릭하면 Chrome이 다운로드 응답이 없으며 FF6에서 오류 메시지가 나타납니다. 이를 통해 우리는 웹 작업자가 JS의 도메인 간 로딩을 지원하지 않는다는 것을 알 수 있습니다. 이는 정적 파일을 별도의 정적 서버에 배포하는 웹 사이트에 나쁜 소식입니다.

따라서 Web Worker는 동일한 도메인에서 json 데이터를 로드하는 데만 사용할 수 있지만 ajax는 이미 이 작업을 수행할 수 있으며 더 효율적이고 다재다능합니다. 작업자가 잘하는 일을 하게 하세요.
4: 요약

웹 작업자는 겉으로는 멋져 보이지만 악마로 가득 차 있습니다.

우리가 할 수 있는 일:

1. JS를 로드하여 메인 프로세스를 중단하지 않고도 수많은 복잡한 계산을 수행하고 postMessage, onmessage를 통해 통신할 수 있습니다

2. importScripts(url)을 통해 워커에 추가 스크립트 파일을 로드할 수 있습니다

 3. setTimeout(),clearTimeout(), setInterval(),clearInterval()을 사용할 수 있습니다

4. XMLHttpRequest를 사용하여 요청을 보낼 수 있습니다

5. 네비게이터의 일부 속성에 액세스할 수 있습니다

제한 사항은 무엇입니까?

1. 도메인 간 JS를 로드할 수 없습니다

 2. 워커 내의 코드는 DOM에 접근할 수 없습니다

3. 다양한 브라우저에서 Worker 구현이 일관되지 않습니다. 예를 들어 FF에서는 작업자에서 새 작업자 생성을 허용하지만 Chrome에서는 허용하지 않습니다.

 4. 모든 브라우저가 이 새로운 기능을 지원하는 것은 아닙니다

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.