HTML5 Web Worker的使用
Web Workers 是 HTML5 提供的一个javascript多线程解决方案,我们可以将一些大计算量的代码交由web Worker运行而不冻结用户界面。
一:如何使用Worker
Web Worker的基本原理就是在当前javascript的主线程中,使用Worker类加载一个javascript文件来开辟一个新的线程,起到互不阻塞执行的效果,并且提供主线程和新线程之间数据交换的接口:postMessage,onmessage。
那么如何使用呢,我们看一个例子:
<span style="color: #008000;">//</span><span style="color: #008000;">worker.js</span><span style="color: #008000;"><br></span><span style="color: #000000;">onmessage </span><span style="color: #000000;">=</span><span style="color: #0000ff;">function</span><span style="color: #000000;"> (evt){<br></span><span style="color: #0000ff;">var</span><span style="color: #000000;"> d </span><span style="color: #000000;">=</span><span style="color: #000000;"> evt.data;</span><span style="color: #008000;">//</span><span style="color: #008000;">通过evt.data获得发送来的数据</span><span style="color: #008000;"><br></span><span style="color: #000000;"> postMessage( d );</span><span style="color: #008000;">//</span><span style="color: #008000;">将获取到的数据发送会主线程</span><span style="color: #008000;"><br></span><span style="color: #000000;">}</span>
HTML页面:test.html
<span style="color: #0000ff;"><!</span><span style="color: #ff00ff;">DOCTYPE HTML</span><span style="color: #0000ff;">></span><span style="color: #000000;"><br></span><span style="color: #0000ff;"><</span><span style="color: #800000;">html</span><span style="color: #0000ff;">></span><span style="color: #000000;"><br></span><span style="color: #0000ff;"><</span><span style="color: #800000;">head</span><span style="color: #0000ff;">></span><span style="color: #000000;"><br></span><span style="color: #0000ff;"><</span><span style="color: #800000;">meta </span><span style="color: #ff0000;">http-equiv</span><span style="color: #0000ff;">="Content-Type"</span><span style="color: #ff0000;"> content</span><span style="color: #0000ff;">="text/html; charset=utf-8"</span><span style="color: #0000ff;">/></span><span style="color: #000000;"><br></span><span style="color: #0000ff;"><</span><span style="color: #800000;">script </span><span style="color: #ff0000;">type</span><span style="color: #0000ff;">="text/javascript"</span><span style="color: #0000ff;">></span><span style="background-color: #f5f5f5; color: #000000;"><br></span><span style="background-color: #f5f5f5; color: #008000;">//</span><span style="background-color: #f5f5f5; color: #008000;">WEB页主线程</span><span style="background-color: #f5f5f5; color: #008000;"><br></span><span style="background-color: #f5f5f5; color: #0000ff;">var</span><span style="background-color: #f5f5f5; color: #000000;"> worker </span><span style="background-color: #f5f5f5; color: #000000;">=</span><span style="background-color: #f5f5f5; color: #0000ff;">new</span><span style="background-color: #f5f5f5; color: #000000;"> Worker(</span><span style="background-color: #f5f5f5; color: #000000;">"</span><span style="background-color: #f5f5f5; color: #000000;">worker.js</span><span style="background-color: #f5f5f5; color: #000000;">"</span><span style="background-color: #f5f5f5; color: #000000;">); </span><span style="background-color: #f5f5f5; color: #008000;">//</span><span style="background-color: #f5f5f5; color: #008000;">创建一个Worker对象并向它传递将在新线程中执行的脚本的URL</span><span style="background-color: #f5f5f5; color: #008000;"><br></span><span style="background-color: #f5f5f5; color: #000000;"> worker.postMessage(</span><span style="background-color: #f5f5f5; color: #000000;">"</span><span style="background-color: #f5f5f5; color: #000000;">hello world</span><span style="background-color: #f5f5f5; color: #000000;">"</span><span style="background-color: #f5f5f5; color: #000000;">); </span><span style="background-color: #f5f5f5; color: #008000;">//</span><span style="background-color: #f5f5f5; color: #008000;">向worker发送数据</span><span style="background-color: #f5f5f5; color: #008000;"><br></span><span style="background-color: #f5f5f5; color: #000000;"> worker.onmessage </span><span style="background-color: #f5f5f5; color: #000000;">=</span><span style="background-color: #f5f5f5; color: #0000ff;">function</span><span style="background-color: #f5f5f5; color: #000000;">(evt){ </span><span style="background-color: #f5f5f5; color: #008000;">//</span><span style="background-color: #f5f5f5; color: #008000;">接收worker传过来的数据函数</span><span style="background-color: #f5f5f5; color: #008000;"><br></span><span style="background-color: #f5f5f5; color: #000000;"> console.log(evt.data); </span><span style="background-color: #f5f5f5; color: #008000;">//</span><span style="background-color: #f5f5f5; color: #008000;">输出worker发送来的数据</span><span style="background-color: #f5f5f5; color: #008000;"><br></span><span style="background-color: #f5f5f5; color: #000000;"> }<br></span><span style="color: #0000ff;"></</span><span style="color: #800000;">script</span><span style="color: #0000ff;">></span><span style="color: #000000;"><br></span><span style="color: #0000ff;"></</span><span style="color: #800000;">head</span><span style="color: #0000ff;">></span><span style="color: #000000;"><br></span><span style="color: #0000ff;"><</span><span style="color: #800000;">body</span><span style="color: #0000ff;">></</span><span style="color: #800000;">body</span><span style="color: #0000ff;">></span><span style="color: #000000;"><br></span><span style="color: #0000ff;"></</span><span style="color: #800000;">html</span><span style="color: #0000ff;">></span>
用Chrome浏览器打开test.html后,控制台输出 "hello world" 表示程序执行成功。
通过这个例子我们可以看出使用web worker主要分为以下几部分
WEB主线程:
1.通过 worker = new Worker( url ) 加载一个JS文件来创建一个worker,同时返回一个worker实例。
2.通过worker.postMessage( data ) 方法来向worker发送数据。
3.绑定worker.onmessage方法来接收worker发送过来的数据。
4.可以使用 worker.terminate() 来终止一个worker的执行。
worker新线程:
1.通过postMessage( data ) 方法来向主线程发送数据。
2.绑定onmessage方法来接收主线程发送过来的数据。
二:Worker能做什么
知道了如何使用web worker ,那么它到底有什么用,可以帮我们解决那些问题呢。我们来看一个fibonacci数列的例子。
大家知道在数学上,fibonacci数列被以递归的方法定义:F0=0,F1=1,Fn=F(n-1)+F(n-2)(n>=2,n∈N*),而javascript的常用实现为:
<span style="color: #0000ff;">var</span><span style="color: #000000;"> fibonacci </span><span style="color: #000000;">=</span><span style="color: #0000ff;">function</span><span style="color: #000000;">(n) {<br></span><span style="color: #0000ff;">return</span><span style="color: #000000;"> n </span><span style="color: #000000;"><</span><span style="color: #000000;">2</span><span style="color: #000000;">?</span><span style="color: #000000;"> n : arguments.callee(n </span><span style="color: #000000;">-</span><span style="color: #000000;">1</span><span style="color: #000000;">) </span><span style="color: #000000;">+</span><span style="color: #000000;"> arguments.callee(n </span><span style="color: #000000;">-</span><span style="color: #000000;">2</span><span style="color: #000000;">);<br>};<br></span><span style="color: #008000;">//</span><span style="color: #008000;">fibonacci(36)</span>
在chrome中用该方法进行39的fibonacci数列执行时间为19097毫秒 ,而要计算40的时候浏览器直接提示脚本忙了。
由于javascript是单线程执行的,在求数列的过程中浏览器不能执行其它javascript脚本,UI渲染线程也会被挂起,从而导致浏览器进入僵死状态。使用web worker将数列的计算过程放入一个新线程里去执行将避免这种情况的出现。具体看例子:
<span style="color: #008000;">//</span><span style="color: #008000;">fibonacci.js</span><span style="color: #008000;"><br></span><span style="color: #0000ff;">var</span><span style="color: #000000;"> fibonacci </span><span style="color: #000000;">=</span><span style="color: #0000ff;">function</span><span style="color: #000000;">(n) {<br></span><span style="color: #0000ff;">return</span><span style="color: #000000;"> n </span><span style="color: #000000;"><</span><span style="color: #000000;">2</span><span style="color: #000000;">?</span><span style="color: #000000;"> n : arguments.callee(n </span><span style="color: #000000;">-</span><span style="color: #000000;">1</span><span style="color: #000000;">) </span><span style="color: #000000;">+</span><span style="color: #000000;"> arguments.callee(n </span><span style="color: #000000;">-</span><span style="color: #000000;">2</span><span style="color: #000000;">);<br>};<br>onmessage </span><span style="color: #000000;">=</span><span style="color: #0000ff;">function</span><span style="color: #000000;">(event) {<br></span><span style="color: #0000ff;">var</span><span style="color: #000000;"> n </span><span style="color: #000000;">=</span><span style="color: #000000;"> parseInt(event.data, </span><span style="color: #000000;">10</span><span style="color: #000000;">);<br> postMessage(fibonacci(n));<br>};</span>
HTML页面:fibonacci.html
<span style="color: #0000ff;"><!</span><span style="color: #ff00ff;">DOCTYPE HTML</span><span style="color: #0000ff;">></span><span style="color: #000000;"><br></span><span style="color: #0000ff;"><</span><span style="color: #800000;">html</span><span style="color: #0000ff;">></span><span style="color: #000000;"><br></span><span style="color: #0000ff;"><</span><span style="color: #800000;">head</span><span style="color: #0000ff;">></span><span style="color: #000000;"><br></span><span style="color: #0000ff;"><</span><span style="color: #800000;">meta </span><span style="color: #ff0000;">http-equiv</span><span style="color: #0000ff;">="Content-Type"</span><span style="color: #ff0000;"> content</span><span style="color: #0000ff;">="text/html; charset=utf-8"</span><span style="color: #0000ff;">/></span><span style="color: #000000;"><br></span><span style="color: #0000ff;"><</span><span style="color: #800000;">title</span><span style="color: #0000ff;">></span><span style="color: #000000;">web worker fibonacci</span><span style="color: #0000ff;"></</span><span style="color: #800000;">title</span><span style="color: #0000ff;">></span><span style="color: #000000;"><br></span><span style="color: #0000ff;"><</span><span style="color: #800000;">script </span><span style="color: #ff0000;">type</span><span style="color: #0000ff;">="text/javascript"</span><span style="color: #0000ff;">></span><span style="background-color: #f5f5f5; color: #000000;"><br> onload </span><span style="background-color: #f5f5f5; color: #000000;">=</span><span style="background-color: #f5f5f5; color: #0000ff;">function</span><span style="background-color: #f5f5f5; color: #000000;">(){<br></span><span style="background-color: #f5f5f5; color: #0000ff;">var</span><span style="background-color: #f5f5f5; color: #000000;"> worker </span><span style="background-color: #f5f5f5; color: #000000;">=</span><span style="background-color: #f5f5f5; color: #0000ff;">new</span><span style="background-color: #f5f5f5; color: #000000;"> Worker(</span><span style="background-color: #f5f5f5; color: #000000;">'</span><span style="background-color: #f5f5f5; color: #000000;">fibonacci.js</span><span style="background-color: #f5f5f5; color: #000000;">'</span><span style="background-color: #f5f5f5; color: #000000;">); <br> worker.addEventListener(</span><span style="background-color: #f5f5f5; color: #000000;">'</span><span style="background-color: #f5f5f5; color: #000000;">message</span><span style="background-color: #f5f5f5; color: #000000;">'</span><span style="background-color: #f5f5f5; color: #000000;">, </span><span style="background-color: #f5f5f5; color: #0000ff;">function</span><span style="background-color: #f5f5f5; color: #000000;">(event) {<br></span><span style="background-color: #f5f5f5; color: #0000ff;">var</span><span style="background-color: #f5f5f5; color: #000000;"> timer2 </span><span style="background-color: #f5f5f5; color: #000000;">=</span><span style="background-color: #f5f5f5; color: #000000;"> (</span><span style="background-color: #f5f5f5; color: #0000ff;">new</span><span style="background-color: #f5f5f5; color: #000000;"> Date()).valueOf();<br> console.log( </span><span style="background-color: #f5f5f5; color: #000000;">'</span><span style="background-color: #f5f5f5; color: #000000;">结果:</span><span style="background-color: #f5f5f5; color: #000000;">'</span><span style="background-color: #f5f5f5; color: #000000;">+</span><span style="background-color: #f5f5f5; color: #000000;">event.data, </span><span style="background-color: #f5f5f5; color: #000000;">'</span><span style="background-color: #f5f5f5; color: #000000;">时间:</span><span style="background-color: #f5f5f5; color: #000000;">'</span><span style="background-color: #f5f5f5; color: #000000;">+</span><span style="background-color: #f5f5f5; color: #000000;"> timer2, </span><span style="background-color: #f5f5f5; color: #000000;">'</span><span style="background-color: #f5f5f5; color: #000000;">用时:</span><span style="background-color: #f5f5f5; color: #000000;">'</span><span style="background-color: #f5f5f5; color: #000000;">+</span><span style="background-color: #f5f5f5; color: #000000;"> ( timer2 </span><span style="background-color: #f5f5f5; color: #000000;">-</span><span style="background-color: #f5f5f5; color: #000000;"> timer ) );<br> }, </span><span style="background-color: #f5f5f5; color: #0000ff;">false</span><span style="background-color: #f5f5f5; color: #000000;">);<br></span><span style="background-color: #f5f5f5; color: #0000ff;">var</span><span style="background-color: #f5f5f5; color: #000000;"> timer </span><span style="background-color: #f5f5f5; color: #000000;">=</span><span style="background-color: #f5f5f5; color: #000000;"> (</span><span style="background-color: #f5f5f5; color: #0000ff;">new</span><span style="background-color: #f5f5f5; color: #000000;"> Date()).valueOf();<br> console.log(</span><span style="background-color: #f5f5f5; color: #000000;">'</span><span style="background-color: #f5f5f5; color: #000000;">开始计算:40</span><span style="background-color: #f5f5f5; color: #000000;">'</span><span style="background-color: #f5f5f5; color: #000000;">,</span><span style="background-color: #f5f5f5; color: #000000;">'</span><span style="background-color: #f5f5f5; color: #000000;">时间:</span><span style="background-color: #f5f5f5; color: #000000;">'</span><span style="background-color: #f5f5f5; color: #000000;">+</span><span style="background-color: #f5f5f5; color: #000000;"> timer );<br> setTimeout(</span><span style="background-color: #f5f5f5; color: #0000ff;">function</span><span style="background-color: #f5f5f5; color: #000000;">(){<br> console.log(</span><span style="background-color: #f5f5f5; color: #000000;">'</span><span style="background-color: #f5f5f5; color: #000000;">定时器函数在计算数列时执行了</span><span style="background-color: #f5f5f5; color: #000000;">'</span><span style="background-color: #f5f5f5; color: #000000;">, </span><span style="background-color: #f5f5f5; color: #000000;">'</span><span style="background-color: #f5f5f5; color: #000000;">时间:</span><span style="background-color: #f5f5f5; color: #000000;">'</span><span style="background-color: #f5f5f5; color: #000000;">+</span><span style="background-color: #f5f5f5; color: #000000;"> (</span><span style="background-color: #f5f5f5; color: #0000ff;">new</span><span style="background-color: #f5f5f5; color: #000000;"> Date()).valueOf() );<br> },</span><span style="background-color: #f5f5f5; color: #000000;">1000</span><span style="background-color: #f5f5f5; color: #000000;">);<br> worker.postMessage(40</span><span style="background-color: #f5f5f5; color: #000000;">);<br> console.log(</span><span style="background-color: #f5f5f5; color: #000000;">'</span><span style="background-color: #f5f5f5; color: #000000;">我在计算数列的时候执行了</span><span style="background-color: #f5f5f5; color: #000000;">'</span><span style="background-color: #f5f5f5; color: #000000;">, </span><span style="background-color: #f5f5f5; color: #000000;">'</span><span style="background-color: #f5f5f5; color: #000000;">时间:</span><span style="background-color: #f5f5f5; color: #000000;">'</span><span style="background-color: #f5f5f5; color: #000000;">+</span><span style="background-color: #f5f5f5; color: #000000;"> (</span><span style="background-color: #f5f5f5; color: #0000ff;">new</span><span style="background-color: #f5f5f5; color: #000000;"> Date()).valueOf() );<br> } <br></span><span style="color: #0000ff;"></</span><span style="color: #800000;">script</span><span style="color: #0000ff;">></span><span style="color: #000000;"><br></span><span style="color: #0000ff;"></</span><span style="color: #800000;">head</span><span style="color: #0000ff;">></span><span style="color: #000000;"><br></span><span style="color: #0000ff;"><</span><span style="color: #800000;">body</span><span style="color: #0000ff;">></span><span style="color: #000000;"><br></span><span style="color: #0000ff;"></</span><span style="color: #800000;">body</span><span style="color: #0000ff;">></span><span style="color: #000000;"><br></span><span style="color: #0000ff;"></</span><span style="color: #800000;">html</span><span style="color: #0000ff;">></span>
在Chrome中打开fibonacci.html,控制台得到如下输出:
<span style="color: #000000;">开始计算:</span><span style="color: #000000;">40</span><span style="color: #000000;"> 时间:</span><span style="color: #000000;">1316508212705</span><span style="color: #000000;"><br>我在计算数列的时候执行了 时间:</span><span style="color: #000000;">1316508212734</span><span style="color: #000000;"><br>定时器函数在计算数列时执行了 时间:</span><span style="color: #000000;">1316508213735</span><span style="color: #000000;"><br>结果:</span><span style="color: #000000;">102334155</span><span style="color: #000000;"> 时间:</span><span style="color: #000000;">1316508262820</span><span style="color: #000000;"> 用时:</span><span style="color: #000000;">50115</span>
这个例子说明在worker中执行的fibonacci数列的计算并不会影响到主线程的代码执行,完全在自己独立的线程中计算,只是在计算完成之后将结果发回主线程。
利用web worker我们可以在前端执行一些复杂的大量运算而不会影响页面的展示,并且不会弹出恶心的脚本正忙提示。
下面这个例子使用了web worker来计算场景中的像素,场景打开时是一片一片进行绘制的,一个worker只计算一块像素值。
http://www.php.cn/
三:Worker的其他尝试
我们已经知道Worker通过接收一个URL来创建一个worker,那么我们是否可以利用web worker来做一些类似jsonp的请求呢,大家知道jsonp是通过插入script标签来加载json数据的,而script元素在加载和执行过程中都是阻塞式的,如果能利用web worker实现异步加载将会非常不错。
下面这个例子将通过 web worker、jsonp、ajax三种不同的方式来加载一个169.42KB大小的JSON数据
<span style="color: #008000;">//</span><span style="color: #008000;"> /aj/webWorker/core.js</span><span style="color: #008000;"><br></span><span style="color: #0000ff;">function</span><span style="color: #000000;"> $E(id) {<br></span><span style="color: #0000ff;">return</span><span style="color: #000000;"> document.getElementById(id);<br>}<br>onload </span><span style="color: #000000;">=</span><span style="color: #0000ff;">function</span><span style="color: #000000;">() {<br></span><span style="color: #008000;">//</span><span style="color: #008000;">通过web worker加载</span><span style="color: #008000;"><br></span><span style="color: #000000;"> $E(</span><span style="color: #000000;">'</span><span style="color: #000000;">workerLoad</span><span style="color: #000000;">'</span><span style="color: #000000;">).onclick </span><span style="color: #000000;">=</span><span style="color: #0000ff;">function</span><span style="color: #000000;">() {<br></span><span style="color: #0000ff;">var</span><span style="color: #000000;"> url </span><span style="color: #000000;">=</span><span style="color: #000000;">'</span><span style="color: #000000;">http://www.php.cn/</span><span style="color: #000000;">'</span><span style="color: #000000;">;<br></span><span style="color: #0000ff;">var</span><span style="color: #000000;"> d </span><span style="color: #000000;">=</span><span style="color: #000000;"> (</span><span style="color: #0000ff;">new</span><span style="color: #000000;"> Date()).valueOf();<br></span><span style="color: #0000ff;">var</span><span style="color: #000000;"> worker </span><span style="color: #000000;">=</span><span style="color: #0000ff;">new</span><span style="color: #000000;"> Worker(url);<br> worker.onmessage </span><span style="color: #000000;">=</span><span style="color: #0000ff;">function</span><span style="color: #000000;">(obj) {<br> console.log(</span><span style="color: #000000;">'</span><span style="color: #000000;">web worker: </span><span style="color: #000000;">'</span><span style="color: #000000;">+</span><span style="color: #000000;"> ((</span><span style="color: #0000ff;">new</span><span style="color: #000000;"> Date()).valueOf() </span><span style="color: #000000;">-</span><span style="color: #000000;"> d));<br> };<br> };<br></span><span style="color: #008000;">//</span><span style="color: #008000;">通过jsonp加载</span><span style="color: #008000;"><br></span><span style="color: #000000;"> $E(</span><span style="color: #000000;">'</span><span style="color: #000000;">jsonpLoad</span><span style="color: #000000;">'</span><span style="color: #000000;">).onclick </span><span style="color: #000000;">=</span><span style="color: #0000ff;">function</span><span style="color: #000000;">() {<br></span><span style="color: #0000ff;">var</span><span style="color: #000000;"> url </span><span style="color: #000000;">=</span><span style="color: #000000;">'</span><span style="color: #000000;">http://www.php.cn/</span><span style="color: #000000;">'</span><span style="color: #000000;">;<br></span><span style="color: #0000ff;">var</span><span style="color: #000000;"> d </span><span style="color: #000000;">=</span><span style="color: #000000;"> (</span><span style="color: #0000ff;">new</span><span style="color: #000000;"> Date()).valueOf();<br> STK.core.io.scriptLoader({<br> method:</span><span style="color: #000000;">'</span><span style="color: #000000;">post</span><span style="color: #000000;">'</span><span style="color: #000000;">,<br> url : url,<br> onComplete : </span><span style="color: #0000ff;">function</span><span style="color: #000000;">() {<br> console.log(</span><span style="color: #000000;">'</span><span style="color: #000000;">jsonp: </span><span style="color: #000000;">'</span><span style="color: #000000;">+</span><span style="color: #000000;"> ((</span><span style="color: #0000ff;">new</span><span style="color: #000000;"> Date()).valueOf() </span><span style="color: #000000;">-</span><span style="color: #000000;"> d));<br> }<br> });<br> };<br></span><span style="color: #008000;">//</span><span style="color: #008000;">通过ajax加载</span><span style="color: #008000;"><br></span><span style="color: #000000;"> $E(</span><span style="color: #000000;">'</span><span style="color: #000000;">ajaxLoad</span><span style="color: #000000;">'</span><span style="color: #000000;">).onclick </span><span style="color: #000000;">=</span><span style="color: #0000ff;">function</span><span style="color: #000000;">() {<br></span><span style="color: #0000ff;">var</span><span style="color: #000000;"> url </span><span style="color: #000000;">=</span><span style="color: #000000;">'</span><span style="color: #000000;">http://www.php.cn/</span><span style="color: #000000;">'</span><span style="color: #000000;">;<br></span><span style="color: #0000ff;">var</span><span style="color: #000000;"> d </span><span style="color: #000000;">=</span><span style="color: #000000;"> (</span><span style="color: #0000ff;">new</span><span style="color: #000000;"> Date()).valueOf();<br> STK.core.io.ajax({<br> url : url,<br> onComplete : </span><span style="color: #0000ff;">function</span><span style="color: #000000;">(json) {<br> console.log(</span><span style="color: #000000;">'</span><span style="color: #000000;">ajax: </span><span style="color: #000000;">'</span><span style="color: #000000;">+</span><span style="color: #000000;"> ((</span><span style="color: #0000ff;">new</span><span style="color: #000000;"> Date()).valueOf() </span><span style="color: #000000;">-</span><span style="color: #000000;"> d));<br> }<br> });<br> };<br>};</span>
HTML页面:/aj/webWorker/worker.html
<span style="color: #0000ff;"><!</span><span style="color: #ff00ff;">DOCTYPE HTML</span><span style="color: #0000ff;">></span><span style="color: #000000;"><br></span><span style="color: #0000ff;"><</span><span style="color: #800000;">html</span><span style="color: #0000ff;">></span><span style="color: #000000;"><br></span><span style="color: #0000ff;"><</span><span style="color: #800000;">head</span><span style="color: #0000ff;">></span><span style="color: #000000;"><br></span><span style="color: #0000ff;"><</span><span style="color: #800000;">meta </span><span style="color: #ff0000;">http-equiv</span><span style="color: #0000ff;">="Content-Type"</span><span style="color: #ff0000;"> content</span><span style="color: #0000ff;">="text/html; charset=utf-8"</span><span style="color: #0000ff;">/></span><span style="color: #000000;"><br></span><span style="color: #0000ff;"><</span><span style="color: #800000;">title</span><span style="color: #0000ff;">></span><span style="color: #000000;">Worker example: load data</span><span style="color: #0000ff;"></</span><span style="color: #800000;">title</span><span style="color: #0000ff;">></span><span style="color: #000000;"><br></span><span style="color: #0000ff;"><</span><span style="color: #800000;">script </span><span style="color: #ff0000;">src</span><span style="color: #0000ff;">="http://js.t.sinajs.cn/STK/js/gaea.1.14.js"</span><span style="color: #ff0000;"> type</span><span style="color: #0000ff;">="text/javascript"</span><span style="color: #0000ff;">></</span><span style="color: #800000;">script</span><span style="color: #0000ff;">></span><span style="color: #000000;"><br></span><span style="color: #0000ff;"><</span><span style="color: #800000;">script </span><span style="color: #ff0000;">type</span><span style="color: #0000ff;">="text/javascript"</span><span style="color: #ff0000;"> src</span><span style="color: #0000ff;">="http://js.wcdn.cn/aj/webWorker/core.js"</span><span style="color: #0000ff;">></</span><span style="color: #800000;">script</span><span style="color: #0000ff;">></span><span style="color: #000000;"><br></span><span style="color: #0000ff;"></</span><span style="color: #800000;">head</span><span style="color: #0000ff;">></span><span style="color: #000000;"><br></span><span style="color: #0000ff;"><</span><span style="color: #800000;">body</span><span style="color: #0000ff;">></span><span style="color: #000000;"><br></span><span style="color: #0000ff;"><</span><span style="color: #800000;">input </span><span style="color: #ff0000;">type</span><span style="color: #0000ff;">="button"</span><span style="color: #ff0000;"> id</span><span style="color: #0000ff;">="workerLoad"</span><span style="color: #ff0000;"> value</span><span style="color: #0000ff;">="web worker加载"</span><span style="color: #0000ff;">></</span><span style="color: #800000;">input</span><span style="color: #0000ff;">></span><span style="color: #000000;"><br></span><span style="color: #0000ff;"><</span><span style="color: #800000;">input </span><span style="color: #ff0000;">type</span><span style="color: #0000ff;">="button"</span><span style="color: #ff0000;"> id</span><span style="color: #0000ff;">="jsonpLoad"</span><span style="color: #ff0000;"> value</span><span style="color: #0000ff;">="jsonp加载"</span><span style="color: #0000ff;">></</span><span style="color: #800000;">input</span><span style="color: #0000ff;">></span><span style="color: #000000;"><br></span><span style="color: #0000ff;"><</span><span style="color: #800000;">input </span><span style="color: #ff0000;">type</span><span style="color: #0000ff;">="button"</span><span style="color: #ff0000;"> id</span><span style="color: #0000ff;">="ajaxLoad"</span><span style="color: #ff0000;"> value</span><span style="color: #0000ff;">="ajax加载"</span><span style="color: #0000ff;">></</span><span style="color: #800000;">input</span><span style="color: #0000ff;">></span><span style="color: #000000;"><br></span><span style="color: #0000ff;"></</span><span style="color: #800000;">body</span><span style="color: #0000ff;">></span><span style="color: #000000;"><br></span><span style="color: #0000ff;"></</span><span style="color: #800000;">html</span><span style="color: #0000ff;">></span>
设置HOST
127.0.0.1 js.wcdn.cn
通过 http://www.php.cn/ 访问页面然后分别通过三种方式加载数据,得到控制台输出:
<span style="color: #000000;">web worker: </span><span style="color: #000000;">174</span><span style="color: #000000;"><br>jsonp: </span><span style="color: #000000;">25</span><span style="color: #000000;"><br>ajax: </span><span style="color: #000000;">38</span>
多试几次发现通过jsonp和ajax加载数据的时间相差不大,而web worker的加载时间一直处于高位,所以用web worker来加载数据还是比较慢的,即便是大数据量情况下也没任何优势,可能是Worker初始化新起线程比较耗时间。除了在加载过程中是无阻塞的之外没有任何优势。
那么web worker是否能支持跨域js加载呢,这次我们通过http://www.php.cn/ 来访问页面,当点击 "web worker加载" 加载按钮时Chrome下无任何反映,FF6下提示错误。由此我们可以知道web worker是不支持跨域加载JS的,这对于将静态文件部署到单独的静态服务器的网站来说是个坏消息。
所以web worker只能用来加载同域下的json数据,而这方面ajax已经可以做到了,而且效率更高更通用。还是让Worker做它自己擅长的事吧。
四:总结
web worker看起来很美好,但处处是魔鬼。
我们可以做什么:
1.可以加载一个JS进行大量的复杂计算而不挂起主进程,并通过postMessage,onmessage进行通信
2.可以在worker中通过importScripts(url)加载另外的脚本文件
3.可以使用 setTimeout(), clearTimeout(), setInterval(), and clearInterval()
4.可以使用XMLHttpRequest来发送请求
5.可以访问navigator的部分属性
有那些局限性:
1.不能跨域加载JS
2.worker内代码不能访问DOM
3.各个浏览器对Worker的实现不大一致,例如FF里允许worker中创建新的worker,而Chrome中就不行
4.不是每个浏览器都支持这个新特性
以上就是HTML5 Web Worker的使用的内容,更多相关内容请关注PHP中文网(www.php.cn)!

핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

Video Face Swap
완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

뜨거운 주제











HTML의 테이블 테두리 안내. 여기에서는 HTML의 테이블 테두리 예제를 사용하여 테이블 테두리를 정의하는 여러 가지 방법을 논의합니다.

HTML의 Nested Table에 대한 안내입니다. 여기에서는 각 예와 함께 테이블 내에 테이블을 만드는 방법을 설명합니다.

HTML 여백-왼쪽 안내. 여기에서는 HTML margin-left에 대한 간략한 개요와 코드 구현과 함께 예제를 논의합니다.

HTML 테이블 레이아웃 안내. 여기에서는 HTML 테이블 레이아웃의 값에 대해 예제 및 출력 n 세부 사항과 함께 논의합니다.

HTML 입력 자리 표시자 안내. 여기서는 코드 및 출력과 함께 HTML 입력 자리 표시자의 예를 논의합니다.

HTML에서 텍스트 이동 안내. 여기서는 Marquee 태그가 구문과 함께 작동하는 방식과 구현할 예제에 대해 소개합니다.

HTML 순서 목록에 대한 안내입니다. 여기서는 HTML Ordered 목록 및 유형에 대한 소개와 각각의 예에 대해서도 설명합니다.

HTML onclick 버튼에 대한 안내입니다. 여기에서는 각각의 소개, 작업, 예제 및 다양한 이벤트의 onclick 이벤트에 대해 설명합니다.
