【Web微知識系列】 Web Workers

閱讀時間約 6 分鐘
Web Workers主要提供簡單的API讓網頁在背景執行緒中執行程式而不干擾使用者的操作。

為什麼javascript要設計為單執行緒?

javascript主要功能是與user操作頁面互動及操作dom,試想若使用多執行緒的概念,那麼一個動作是新增至某個dom節點,另一個動作則是修改該dom節點,此時瀏覽器應該使用哪個動作為準? 所以為了避免複雜性才設計為單執行緒。

理解javascript非同步的概念

單執行緒就表示說所有任務都需要排隊處理,相對的效率較低落,IO或Network request通常需要等待較長的時間,如果前端頁面常常因為這些動作發生堵塞則user看到的畫面就是整個鎖死的,因此javascript使用了一些機制來避免這個問題,主要將任務分為兩種:
  • 同步任務: 主執行緒上排隊執行的任務。
  • 異步任務: 不進入主執行緒,而是進入任務佇列等待執行。
上圖的執行機制
  1. 主程序會先從stack中執行function
  2. 執行過程中遇到setTimeout這類的非同步API呼叫,會透過事件委託的機制掛一個callback到setTimeout之類的Web API,執行完畢後會將該callback傳入上圖的callback queue等待。
  3. 執行堆棧空閒時才從callback queue中取出任務執行
  4. 因此我們才會使用setTimeout的技巧讓一些需要長時間計算的任務排到任務佇列中等待,然而主執行緒就不會因為這個任務發生阻塞現象,可以先執行觸發loading動畫的事件後才處理這些耗時的任務,讓user感覺到畫面並非被鎖死
上面的技巧雖然解決了畫面被鎖死的問題,但實際上執行的時間並沒有減少,因此發展出了Web Worker的機制,讓我們在web上也能有多執行緒的功能,最大化的利用系統資源,但是仍有部分功能受限。

Web Workers的類型

Web Workers依照用途又分為Dedicated workers與Shared workers
  • Dedicated workers: 只能與產生它的頁面相互溝通。
  • Shared workers: 只要是相同來源(分頁、iframe)上執行的程序都能夠相互溝通。

應用的情境

一般狀況下或許我們不需要Web Workers來處理程式執行過久的情境,但是若能運用Web Workers或許能將部分Server的運算工作轉移至前端執行,以下是一些大量運算的使用情境:
  • 解密等複雜的數學運算。
  • 排序大量的array。
  • 緩存資料。
  • 語法高亮標記、拼音檢查。
  • 影像、視訊、音頻的解析處理。
  • polling web services。

Work中常用的方法

  • postMessage(data): 子線程與主線程之間相互溝通的方法,傳遞的data為任意值。
  • onmessage: 監聽線程之間message的傳遞,當線程之間觸發postMessage時,能夠藉由onmessage順利接收傳遞的資料。
  • onerror:常用於debug。
  • terminate(): 主線程中終止worker任務的API,一旦終止後不能再次啟用,只能重新創建。

使用上的限制

Web Workers因為安全性問題所以使用上需要有一些使用上的限制:
  • 無法訪問主頁面的dom結構。
  • 無法使用全域變數或者全域函數。
  • 無法使用window或document。
  • 不能傳遞functions。

可以使用的API

上面提到那麼多的限制,那麼Web Workers到底能夠做什麼?
以下列出幾個較常且可以使用的function
  • setTimeout、clearTimeoput、setInterval 等定時器相關的方法。
  • navigator 識別瀏覽器的相關資訊。
  • importScripts() 允許worker載入依賴套件到自己的作用域內。
  • XMLHttpRequest、Websocket 與後端之間的通訊。
  • location read only。
  • Functions and classes available to Web Workers有詳細列出更多可以使用的function。

開始使用Web Workers

這裡主要針對 Dedicated workers示範使用方式,而 Shared workers操作方式大致上相同於 Dedicated workers 因此僅需要了解概念即可。

首先需要檢查瀏覽器是否支援Web Workers

function isWebWorkerSupport() {
return typeof Worker !== “undefined”;
}if (isWebWorkerSupport()) {
….
} else {
alert(“Ops, your browser doesn’t support Web Worker”);
}

簡單的創建一個Worker

var worker = new Worker(“worker.js”);

與Worker之間的溝通方式

main.js
//傳遞消息給worker這裡可以是array、string、number等型態
worker.postMessage(“Send to worker”);
//監聽message事件,接收worker回報的訊息
worker.onmessage = function(e) {
console.log(e.data);
}
worker.js
self.onmessage = function(e) {
//處理複雜運算完成後回報運算結果或者通知
self.postMessage(“finished”);
}

終止worker工作

當每個worker thread完成工作時記得終止,讓瀏覽器能夠釋放資源。
worker.terminate();

實際範例

各家瀏覽器支援狀況

References

為什麼會看到廣告
avatar-img
116會員
257內容數
哈囉,我是阿Han,是一位 👩‍💻 軟體研發工程師,喜歡閱讀、學習、撰寫文章及教學,擅長以圖代文,化繁為簡,除了幫助自己釐清思路之外,也希望藉由圖解的方式幫助大家共同學習,甚至手把手帶您設計出高品質的軟體產品。
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
阿Han的沙龍 的其他內容
Service worker與Web workers相同,也都是一段運行在瀏覽器後台的腳本,提供一些不需要與頁面直接交互的功能(操作dom),主要處理網路相關的問題,可以攔截網路請求進行相對應的優化動作,我們把它想像成與伺服器之間的代理服務器可能會比較容易理解,當網路環境不佳時便回應快取資源,待網路
Cookie簡介與個人隱私議題 在談Cookieless之前我們先來了解什麼是Cookie,這裡的Cookie並不是餅乾的意思,而是為了讓人們在網路上通訊時,能夠創造更無縫的體驗,想像一下,假設我們在使用網站時,每切換一頁就要進行登入一次,我想大部分的人都已經抓狂並放棄使用的吧! 而Cookie的出
我們前一篇有介紹過「Cookieless時代趨勢來臨,與我們息息相關的隱私與行銷方式如何應對呢?」建議先行閱讀,裡面包含Cookie的基本觀念,以及為什麼要捨棄的原因,接下來才進入到本篇的主軸,將會針對FLoC的基本原理、是否能解決個人隱私議題為主軸進行探討。 FLoC的全名是 Federated
延續前一篇談論的主題「Cookieless系列: Floc能解決隱私議題嗎?」,我們已經瞭解到FLoC這項技術解決的隱私的什麼問題,也明白事實上還是存在著風險的,因此Google準備捨棄FLoC迎接新的技術Google Topic,我們也會針對這項技術進行簡單的介紹,共同來學習頂尖的科技公司如何針對
今天來聊聊我們常常使用的網頁,背後怎麼讓我們用的更順暢的一門傳輸方式,HTTP Keep-Alive,透過一點點的小改變,讓傳輸效率提升,減少非必要的浪費。 當我們溝通的過程中沒有KeepAlive的狀況下,會有多次往來的狀況,這樣對雙方來說開銷成本是非常大的,因此為了改善這個現象,加入了一個機制,
我們前一篇介紹了「【Web系列】訂閱技術的基石,RSS Feed是什麼?」,相信也對於訂閱的機制具備一定的認識了,雖然RSS已經能夠滿足我們訂閱的一些基本需求,但由於主要的訂閱端還是定期去檢查更新資訊,因此假設我們想要在最短時間內掌握最新資訊時,仍會有一些延遲,再者也非常浪費頻寬。 我們為什麼不能改
Service worker與Web workers相同,也都是一段運行在瀏覽器後台的腳本,提供一些不需要與頁面直接交互的功能(操作dom),主要處理網路相關的問題,可以攔截網路請求進行相對應的優化動作,我們把它想像成與伺服器之間的代理服務器可能會比較容易理解,當網路環境不佳時便回應快取資源,待網路
Cookie簡介與個人隱私議題 在談Cookieless之前我們先來了解什麼是Cookie,這裡的Cookie並不是餅乾的意思,而是為了讓人們在網路上通訊時,能夠創造更無縫的體驗,想像一下,假設我們在使用網站時,每切換一頁就要進行登入一次,我想大部分的人都已經抓狂並放棄使用的吧! 而Cookie的出
我們前一篇有介紹過「Cookieless時代趨勢來臨,與我們息息相關的隱私與行銷方式如何應對呢?」建議先行閱讀,裡面包含Cookie的基本觀念,以及為什麼要捨棄的原因,接下來才進入到本篇的主軸,將會針對FLoC的基本原理、是否能解決個人隱私議題為主軸進行探討。 FLoC的全名是 Federated
延續前一篇談論的主題「Cookieless系列: Floc能解決隱私議題嗎?」,我們已經瞭解到FLoC這項技術解決的隱私的什麼問題,也明白事實上還是存在著風險的,因此Google準備捨棄FLoC迎接新的技術Google Topic,我們也會針對這項技術進行簡單的介紹,共同來學習頂尖的科技公司如何針對
今天來聊聊我們常常使用的網頁,背後怎麼讓我們用的更順暢的一門傳輸方式,HTTP Keep-Alive,透過一點點的小改變,讓傳輸效率提升,減少非必要的浪費。 當我們溝通的過程中沒有KeepAlive的狀況下,會有多次往來的狀況,這樣對雙方來說開銷成本是非常大的,因此為了改善這個現象,加入了一個機制,
我們前一篇介紹了「【Web系列】訂閱技術的基石,RSS Feed是什麼?」,相信也對於訂閱的機制具備一定的認識了,雖然RSS已經能夠滿足我們訂閱的一些基本需求,但由於主要的訂閱端還是定期去檢查更新資訊,因此假設我們想要在最短時間內掌握最新資訊時,仍會有一些延遲,再者也非常浪費頻寬。 我們為什麼不能改
你可能也想看
Google News 追蹤
Thumbnail
這個秋,Chill 嗨嗨!穿搭美美去賞楓,裝備款款去露營⋯⋯你的秋天怎麼過?秋日 To Do List 等你分享! 秋季全站徵文,我們準備了五個創作主題,參賽還有機會獲得「火烤兩用鍋」,一起來看看如何參加吧~
Thumbnail
11/20日NVDA即將公布最新一期的財報, 今天Sell Side的分析師, 開始調高目標價, 市場的股價也開始反應, 未來一週NVDA將重新回到美股市場的焦點, 今天我們要分析NVDA Sell Side怎麼看待這次NVDA的財報預測, 以及實際上Buy Side的倉位及操作, 從
Thumbnail
Hi 大家好,我是Ethan😊 相近大家都知道保濕是皮膚保養中最基本,也是最重要的一步。無論是在畫室裡長時間對著畫布,還是在旅途中面對各種氣候變化,保持皮膚的水分平衡對我來說至關重要。保濕化妝水不僅能迅速為皮膚補水,還能提升後續保養品的吸收效率。 曾經,我的保養程序簡單到只包括清潔和隨意上乳液
Thumbnail
作為一個非常不專業的前端初學者,有陣子常常卡在公司官網,要插入 Youtube 影片無法RWD(響應式)的問題。 跟不熟悉 網頁技術的朋友們介紹,RWD 就是指網頁的排版能跟著螢幕的大小縮放、變化編排,在這個人手一機的時代,特別重要。
Thumbnail
透過 Web Workers,您可以將這些耗時的操作放在另一個執行緒中處理,減輕主執行緒的負擔,提高網站的效能和響應速度。這篇文章提供了詳細的解釋和示例,幫助您快速上手使用 Web Workers。不要錯過這個可以改善網站效能的實用技巧!
Thumbnail
「日常型」社群平台,如Facebook,聯繫朋友和家人,加入各種社團!「生活型」社群平台,如Instagram和小紅書,分享生活的美好時刻!「新聞型」社群平台,如Twitter和Threads,緊跟即時快訊,了解世界大事!「娛樂型」社群平台,如Youtube和TikTok,這裡是休閒娛樂的樂園!
Thumbnail
本文講述了社群媒體帶來的個人效益和平台效益。其中提到了建立個人品牌的重要性,以及專業交流、學習、創作內容和自媒體的優勢。此外,社交聯繫和友誼也是社群媒體的一個重要面向。文章還探討了社群媒體的規模經濟和經濟效益,以及市場競爭和廣告效益。最後,提到了社群媒體的創新效益,這是一個不斷演進和發展的領域。
Thumbnail
本文探討社群媒體的過去、現在,以及Web 3.0的未來!😲回顧社群媒體的發展史,從FB的統治到IG的崛起,再到Twitter被改名成X。現代社交媒體和串流平台為我們提供了更多的選擇和自由。Web 3.0利用機器學習、人工智慧和區塊鏈技術,使網路更聰明、更分散、更關心隱私。你會接受新時代的知識嗎?
Thumbnail
P.S. 這是一篇發表於去年在另一個帳號的舊文,因為vocus無法變更帳號名,所以我把這篇文章搬過來新帳號重新發表一次。 創作者追求的終極自由作為一名創作者,我夢想達到終極自由,這個終極自由有三個層面: 經濟上的自由/創作上的自由/時空上的自由 經濟上的自由就是終於可以不用白天兼一份工來支持自己
Thumbnail
web 3.0的未來是接近了!(目前 Web 2.5) 1.目前幣圈、NFT的門檻相當高。 (各國金融與法律制度是關鍵) 2.Web3.0的人才是什麼類型的? (這裡可能要做點research,但厲害的人到哪裡都可以適應) 3. 星爺左邊的圖表才是關鍵,大概是未來的 Road map 。 (我大膽猜
Thumbnail
近期隨著區塊鏈應用越來越多,有些區塊鏈的支持者開始喊出「Web 3.0」的口號。他們認為去中心化的區塊鏈將成為新的 Web 3.0,取代因為網路巨頭而過度集中的 Web 2.0,成為眾人的網路。真的如此嗎?我認為,我們應該可以從歷史的角度回過頭來重新思考「去中心化」與「中心化」的關係。
Thumbnail
什麼是Web3.0? Web3.0 ≠ NFT ≠ 虛擬貨幣 ≠ 去中心化 簡單來說,Web3.0 可以說是網際網路的下一個世代技術的「集合總稱」。需要有很多的軟硬體設備同時都互相配合支援才會走到的「世代技術」。最底層硬體技術,我個人覺得是「上網速度的提昇」以及終端機「運算元的速度提昇」。
Thumbnail
這個秋,Chill 嗨嗨!穿搭美美去賞楓,裝備款款去露營⋯⋯你的秋天怎麼過?秋日 To Do List 等你分享! 秋季全站徵文,我們準備了五個創作主題,參賽還有機會獲得「火烤兩用鍋」,一起來看看如何參加吧~
Thumbnail
11/20日NVDA即將公布最新一期的財報, 今天Sell Side的分析師, 開始調高目標價, 市場的股價也開始反應, 未來一週NVDA將重新回到美股市場的焦點, 今天我們要分析NVDA Sell Side怎麼看待這次NVDA的財報預測, 以及實際上Buy Side的倉位及操作, 從
Thumbnail
Hi 大家好,我是Ethan😊 相近大家都知道保濕是皮膚保養中最基本,也是最重要的一步。無論是在畫室裡長時間對著畫布,還是在旅途中面對各種氣候變化,保持皮膚的水分平衡對我來說至關重要。保濕化妝水不僅能迅速為皮膚補水,還能提升後續保養品的吸收效率。 曾經,我的保養程序簡單到只包括清潔和隨意上乳液
Thumbnail
作為一個非常不專業的前端初學者,有陣子常常卡在公司官網,要插入 Youtube 影片無法RWD(響應式)的問題。 跟不熟悉 網頁技術的朋友們介紹,RWD 就是指網頁的排版能跟著螢幕的大小縮放、變化編排,在這個人手一機的時代,特別重要。
Thumbnail
透過 Web Workers,您可以將這些耗時的操作放在另一個執行緒中處理,減輕主執行緒的負擔,提高網站的效能和響應速度。這篇文章提供了詳細的解釋和示例,幫助您快速上手使用 Web Workers。不要錯過這個可以改善網站效能的實用技巧!
Thumbnail
「日常型」社群平台,如Facebook,聯繫朋友和家人,加入各種社團!「生活型」社群平台,如Instagram和小紅書,分享生活的美好時刻!「新聞型」社群平台,如Twitter和Threads,緊跟即時快訊,了解世界大事!「娛樂型」社群平台,如Youtube和TikTok,這裡是休閒娛樂的樂園!
Thumbnail
本文講述了社群媒體帶來的個人效益和平台效益。其中提到了建立個人品牌的重要性,以及專業交流、學習、創作內容和自媒體的優勢。此外,社交聯繫和友誼也是社群媒體的一個重要面向。文章還探討了社群媒體的規模經濟和經濟效益,以及市場競爭和廣告效益。最後,提到了社群媒體的創新效益,這是一個不斷演進和發展的領域。
Thumbnail
本文探討社群媒體的過去、現在,以及Web 3.0的未來!😲回顧社群媒體的發展史,從FB的統治到IG的崛起,再到Twitter被改名成X。現代社交媒體和串流平台為我們提供了更多的選擇和自由。Web 3.0利用機器學習、人工智慧和區塊鏈技術,使網路更聰明、更分散、更關心隱私。你會接受新時代的知識嗎?
Thumbnail
P.S. 這是一篇發表於去年在另一個帳號的舊文,因為vocus無法變更帳號名,所以我把這篇文章搬過來新帳號重新發表一次。 創作者追求的終極自由作為一名創作者,我夢想達到終極自由,這個終極自由有三個層面: 經濟上的自由/創作上的自由/時空上的自由 經濟上的自由就是終於可以不用白天兼一份工來支持自己
Thumbnail
web 3.0的未來是接近了!(目前 Web 2.5) 1.目前幣圈、NFT的門檻相當高。 (各國金融與法律制度是關鍵) 2.Web3.0的人才是什麼類型的? (這裡可能要做點research,但厲害的人到哪裡都可以適應) 3. 星爺左邊的圖表才是關鍵,大概是未來的 Road map 。 (我大膽猜
Thumbnail
近期隨著區塊鏈應用越來越多,有些區塊鏈的支持者開始喊出「Web 3.0」的口號。他們認為去中心化的區塊鏈將成為新的 Web 3.0,取代因為網路巨頭而過度集中的 Web 2.0,成為眾人的網路。真的如此嗎?我認為,我們應該可以從歷史的角度回過頭來重新思考「去中心化」與「中心化」的關係。
Thumbnail
什麼是Web3.0? Web3.0 ≠ NFT ≠ 虛擬貨幣 ≠ 去中心化 簡單來說,Web3.0 可以說是網際網路的下一個世代技術的「集合總稱」。需要有很多的軟硬體設備同時都互相配合支援才會走到的「世代技術」。最底層硬體技術,我個人覺得是「上網速度的提昇」以及終端機「運算元的速度提昇」。