Web Workers ist eine von HTML5 bereitgestellte Javascript-Multithreading-Lösung. Wir können rechenintensiven Code zur Ausführung an Web Worker übergeben, ohne dass die Benutzeroberfläche einfriert.
1: So verwenden Sie Worker
Das Grundprinzip von Web Worker besteht darin, mithilfe der Worker-Klasse eine Javascript-Datei in den aktuellen Hauptthread von Javascript zu laden, um einen neuen Thread zu öffnen, was zu einer nicht blockierenden Ausführung führt und Daten zwischen dem Hauptthread und dem Hauptthread bereitstellt der neue Thread. Getauschte Schnittstellen: postMessage, onmessage.
Wie man es benutzt, schauen wir uns ein Beispiel an:
JavaScript-CodeInhalt in die Zwischenablage kopieren
-
-
onmessage =function (evt){
-
var d = evt.data;
-
postMessage( d );
- }
HTML-Seite: test.html
XML/HTML-CodeInhalt in die Zwischenablage kopieren
- >
-
<html>
-
<<span Stil="width: auto; height: auto; float: none;" id="20_nwp"><a Stil="text- Dekoration: keine; ="_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"><span Stil="color:#0000ff;font-size:14px;width:auto;height:auto;float:none;">head span>a>< /span>>
<meta http-equiv=
- " Content-Type" content="text/html; charset=utf-8"/>
-
<Skript Typ="text/ <span style="width: auto; Höhe: automatisch; float: none;" id="21_nwp">< a style="text-decoration: none;" mpid="21" Ziel="_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&st id=0&t=tpclicked3_hc&tu=u1922429&u=http://www.admin10000.com/document/ 1183.html&urlid=0" id="21_nwl">< ;span style="color:#0000ff;font-size:14px;width:auto; height:auto;float:none;">javascriptspan>a>span>">
- //WEB页主线程
-
var worker =new Worker("worker.js"); //创建一个Worker对象并向它传递将在新线程中执行的脚本的URL
- worker.postMessage("hello world"); //向worker发送数据
-
worker.onmessage =function(evt){ //接收worker传过来的数据 <span style="width: auto; height: auto; float: none ;" id="22_nwp">< ein Stil="text-decoration: none;" mpid="22" target="_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"><span style="color:#0000ff ;font-size:14px;width:auto;height:auto;float:none;">函数 span>a>span>
-
console.log(evt.<span style= "width: auto; height: auto; float: none;" id="23_nwp"><a Stil="text-decoration: none;" mpid="23" Ziel="_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“><span style="color:#0000ff;font-size:14px;width:auto;height:auto;float:none;">data< /span>a>span>); //输出worker发送来的数据
- }
-
Skript>
-
Kopf>
-
<Körper>Körper>
-
html>
Nach dem Öffnen von test.html mit dem Chrome-Browser gibt die Konsole „Hallo Welt“ aus und zeigt damit an, dass die Programmausführung erfolgreich war.
Anhand dieses Beispiels können wir sehen, dass die Verwendung von Web Workern hauptsächlich in die folgenden Teile unterteilt ist
WEB-Hauptthread:
1. Laden Sie eine JS-Datei über worker = new Worker( url), um einen Worker zu erstellen und eine Worker-Instanz zurückzugeben.
2. Senden Sie Daten über die Methode worker.postMessage(data) an den Worker.
3. Binden Sie die Methode worker.onmessage, um die vom Worker gesendeten Daten zu empfangen.
4. Sie können worker.terminate() verwenden, um die Ausführung eines Workers zu beenden.
Arbeiter neuer Thread:
1. Senden Sie Daten über die postMessage(data)-Methode an den Hauptthread.
2. Binden Sie die Onmessage-Methode, um die vom Hauptthread gesendeten Daten zu empfangen.
2: Was kann der Arbeitnehmer tun?
Jetzt wissen wir, wie man Web Worker verwendet, wozu er dient und welche Probleme er uns bei der Lösung helfen kann. Schauen wir uns ein Beispiel der Fibonacci-Folge an.
Jeder weiß, dass die Fibonacci-Folge in der Mathematik rekursiv definiert ist: F0=0, F1=1, Fn=F(n-1) F(n-2) (n>=2, n∈N* ), und die übliche Implementierung von Javascript ist:
JavaScript-CodeInhalt in die Zwischenablage kopieren
-
-
var fibonacci =Funktion(n) {
-
return n <2? n : arguments.callee(n -1) arguments.callee(n -2);
}; -
- //fibonacci(36)
Die Verwendung dieser Methode in Chrome zur Ausführung der Fibonacci-Folge von 39 dauert 19097 Millisekunden, aber wenn es um die Berechnung von 40 geht, meldet der Browser direkt, dass das Skript beschäftigt ist.
Da JavaScript in einem einzelnen Thread ausgeführt wird, kann der Browser während des Berechnungsprozesses der Sequenz keine anderen JavaScript-Skripte ausführen, und der UI-Rendering-Thread wird ebenfalls angehalten, wodurch der Browser in einen Zombie-Zustand wechselt. Wenn Sie einen Web-Worker verwenden, um den Berechnungsprozess der Sequenz in einen neuen Thread zu verschieben, können Sie diese Situation vermeiden. Sehen Sie sich das Beispiel konkret an:
JavaScript-Code
Inhalt in die Zwischenablage kopieren
HTML Open:fibonacci.html
XML/HTML-CodeInternationale Codekonfiguration
- >
-
<html>
-
<<span Stil="width: auto; height: auto; float: none;" id="11_nwp"><a Stil="text- Dekoration: keine; ="_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"><span Stil="color:#0000ff;font-size:14px;width:auto;height:auto;float:none;">head span>a>< /span>>
<meta http-equiv=
- " Content-Type" content="text/html; charset=utf-8"/>
<Titel>Web-Worker-Fibonacci
- Titel>
-
<Skript Typ="text/ <span style="width: auto; Höhe: automatisch; float: none;" id="12_nwp">< a style="text-decoration: none;" mpid="12" Ziel="_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&st id=0&t=tpclicked3_hc&tu=u1922429&u=http://www.admin10000.com/document/ 1183.html&urlid=0" id="12_nwl">< ;span style="color:#0000ff;font-size:14px;width:auto; height:auto;float:none;">javascriptspan>a>span>">
-
onload =Funktion(){
-
var worker =neu Worker('fibonacci.js');
- worker.addEventListener('message', function(event) {
-
var timer2 = (new Date()).valueOf();
-
console.log( '结果:' event.<span style ="width: auto; height: auto; float: none;" id="13_nwp" ><a Stil=" text-decoration: none;" mpid="13" target="_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"><span style= "color:#0000ff;font-size:14px;width:auto;height:auto;float:none;">Datenspan>a> span>, '时间:' timer2, '用时:' ( timer2 - timer ) );
- }, FALSCH);
-
var timer = (new Date()).valueOf();
- console.log('开始计算:40','时间:' timer );
- setTimeout(function(){
-
console.log('定时器<span style="width: auto; height: auto; float: none;" id="14_nwp" ><a Stil="text-decoration : none;" mpid="14" Ziel="_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"><span Stil="color:#0000ff;font-size:14px;width:auto;height:auto;float:none;">函数span>a>span>在计算数列时执行了', '时间:' (new Date()).valueOf( ) );
- },1000);
- worker.postMessage(40);
- console.log('我在计算数列的时候执行了', '时间:' (new Date()).valueOf() );
- }
-
Skript>
-
<span style= "width: auto; height: auto; float: none;" id="15_nwp"><a Stil="Text -decoration: none;" mpid="15" Ziel="_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"><span Stil="color:#0000ff;font-size:14px;width:auto;height:auto;float:none;">headspan>a>< ;/span>>
-
<Körper>
-
Körper>
-
html>
在Chrome中打开fibonacci.html,控制台得到如下输出:
开始计算:40. 时间:1316508212705
我在计算数列的时候执行了 时间:1316508212734
定时器
XML/HTML-Code复制内容到剪贴板
- <span style="width: auto; height : auto; float: none;" id="9_nwp"><a style="text-decoration: none;" mpid="9" Ziel=" _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"><span style="color:#0000ff;font-size:14px;width:auto;height:auto;float:none;">函数 span>a>span>
在计算数列时执行了 时间:1316508213735
结果:102334155 时间:1316508262820 用时:50115
这个例子说明在worker中执行的fibonacci数列的计算并不会影响到主线程的代码执行,完全在自己独立的线程中计算,只是在计算完成之后将结果发回主线程.
利用web worker我们可以在前端执行一些复杂的大量运算而不会影响页面的展示,并且不会弹出恶心的脚本正忙提示.
下面这个例子使用了web Arbeiter只计算一块像素值.
http://nerget.com/rayjs-mt/rayjs.html
三:Worker的其他尝试
我们已经知道Worker通过接收一个URL来创建一个worker,那么我们是否可以利用web. worker来做一些类似json p的请求呢,大家知道jsonp是通过插入script标签来加载json数据的,而script元素在加现异步加载将会非常不错.
下面这个例子将通过 web worker、jsonp、ajax三种不同的方式来加载一个169.42KB大小的JSON数据
JavaScript-Code复制内容到剪贴板
-
-
Funktion $E(id) {
-
return document.getElementById(id);
- }
-
onload =function() {
-
-
$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));
- };
- };
-
-
$E('jsonpLoad').onclick =function() {
-
var url ='http://js.wcdn.cn/aj/mblog/face1' ;
-
var d = (new Date()).valueOf();
- STK.core.io.scriptLoader({
-
Methode:'post',
- URL : URL,
-
onComplete : function() {
-
console.log('jsonp: ' ((new Date()).valueOf() - D));
- }
- });
- };
-
-
$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
XML/HTML-Code复制内容到剪贴板
- >
-
<html>
-
<<span Stil="width: auto; height: auto; float: none;" id="4_nwp"><a Stil="text- Dekoration: keine; ="_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"><span Stil="color:#0000ff;font-size:14px;width:auto;height:auto;float:none;">head span>a>< /span>>
<meta http-equiv=
- " Content-Type" content="text/html; charset=utf-8"/>
-
<Titel>Worker-Beispiel: Last < span style="width: auto; height: auto; float: none;" id="5_nwp"><a style="text-decoration: none;" mpid= "5" Ziel="_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"><span style="color:#0000ff;font-size:14px;width:auto;height:auto;float :none;">Datenspan>< ;/a>span> Titel>
-
<script src="http: //js.t.sinajs.cn/STK/js/gaea.1.14.js" type="text/< ;span style="width: auto; Höhe: automatisch; float: none;" id="6_nwp">< a style="text-decoration: none;" mpid="6" Ziel="_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&st id=0&t=tpclicked3_hc&tu=u1922429&u=http://www.admin10000.com/document/ 1183.html&urlid=0" id="6_nwl">< ;span style="color:#0000ff;font-size:14px;width:auto; height:auto;float:none;">javascriptspan>a>span>">Skript>
-
<script type="text/ javascript" src="http://js.wcdn.cn/aj/webWorker/core.js" >Skript>
-
Kopf>
-
<Körper>
-
<Eingabe Typ="Schaltfläche" id="workerLoad" Wert="web worker加载">Eingabe>
-
<Eingabe Typ="Schaltfläche" id="jsonpLoad" Wert="jsonp加载">Eingabe>
-
<Eingabe Typ="Schaltfläche" id="<span style="width: auto; Höhe: automatisch; float: none;" id="7_nwp">< a style="text-decoration: none;" mpid="7" Ziel="_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&stid =0&t=tpclicked3_hc&tu=u1922429&u=http://www.admin10000.com/document/ 1183.html&urlid=0" id="7_nwl">< ;span style="color:#0000ff;font-size:14px;width:auto; height:auto;float:none;">ajaxspan>a>span>Load" value="ajax加载">Eingabe>
-
Körper>
-
html>
设置HOST
127.0.0.1 js .wcdn.cn
通过 http://js.wcdn.cn/aj/webWorker/worker.html 访问页面然后分别通过三种方式加载数据,得到控制台输出: