close
javascript是一個單一執行緒(thread)的語言,
其concurreny的特性是基於event(像是Button的onclick、Mouse的onfocus......等),
javascript裡面的event存在listener,來監聽事件的發生,而事件的回應處理則是由handler負責。
 
隨者瀏覽器版本不斷更新,前端已經足以處理許多事情,而不需經由後端,
前端可以做的事情就交給前端處理吧!
 
然而,由於javascript是單一執行緒(single thread),
當執行較龐大的運算時,這時網頁會鎖住(hang、blocked),
這時網頁上的所有element(例:Button, Input text box)不管你怎麼點都沒有反應,
直到運算完成,網頁的才又恢復了正常的狀態。
 
咦~那這樣的話使用者在瀏覽網頁不是就會經歷網頁整個blocked,
直到運算完成才恢復正常。
 
甚至,如果該運算所需的時間較久,
有些瀏覽器還會跳出警告訊息,
提醒使用者「瀏覽器正被龐大的資源佔據,因此暫無回應.....」。
 
我把前端可以處理的事情交給前端處理了,但卻遇到上述的情況,跟怎麼做呢?
 
HTML5有定義了javascript能實現多執行緒(multi-thread)的標準API,
就是本篇文章的重點Web Worker
 

網路上有許多資源介紹甚麼是Web Worke,以及怎麼去使它、使用上的限制。
推薦幾個不錯的網站:
 
 

 

感覺還是有點模糊,來看個例子吧!

webworker001.png

 
網頁上有兩種計算費式數列的按鈕,
一個是使用web worker,另一個是使用main thread。

webworker002.png

在input box上輸入較小的數字,使用者可能還感受不到明顯的差異,
但輸入的數字越大(筆者測試大約為30幾時),使用main thread來計算,
會發現按下按鈕後,網頁上的計時短暫停止了,
直到出現result計算完成count才繼續加1。
 
也就是在計算及果的期間,網頁上所有的元素都被blocked了,
這時不管你怎麼點網頁都不會有反應,
這就是單一執行緒,一件事情完成才能繼續處理其他事情。
 
甚至,當網頁回應時間太久,瀏覽器還會出現提示訊息,
筆者測試輸入50來計算費氏數列,就出現了提示訊息:
 
Firefox

alert_firefox2.png

alert_firefox.png

 
Chrome

alert_chrome2.png

alert_chrome.png

來看看程式碼吧!

下面是部份的HTML檔

內容有id為worker的script(或是可以在專案中include .js檔),

這個script供worker使用

 

下面是js檔,一樣有計算費是數列的函式(第21行),

提供給main thread使用

當按下id為 calBtn1的按鈕(第6行),

是使用web worker多執行緒的做法來計算,

按下id為 calBtn2的按鈕(第26行),

是使用main thread單一執行緒的做法來計算。

 

可以使用reset按鈕(第32行)將counter歸零,並且在使用範例的過程中,

也可以觀察到當輸入數字較大時,

按下id為 calBtn2的按鈕,counter的加1會有延遲

直到算完成才繼續。

 

但若是按下id為 calBtn1的按鈕,無論計算完成與否,

counter還是繼續加1。

 


範例網址:

https://codepen.io/jialin128/full/NwLYaY/


請不吝指教 =)

 

 

 

arrow
arrow
    文章標籤
    javascript
    全站熱搜

    Jialin 發表在 痞客邦 留言(0) 人氣()