您的位置: 首頁 >互聯(lián)網(wǎng) >

說一說Web Workers是什么及Web Workers有什么用

2022-08-31 18:07:22 編輯:方睿寧 來源:
導(dǎo)讀 今天來說一下關(guān)于Web Workers是什么及Web Workers有什么用這方面的一些訊息,不少朋友對于Web Workers是什么及Web Workers有什么用這方...

今天來說一下關(guān)于Web Workers是什么及Web Workers有什么用這方面的一些訊息,不少朋友對于Web Workers是什么及Web Workers有什么用這方面的信息頗感興趣的。小編今天就為此整理一些相關(guān)的訊息,希望對有需要的朋友有所幫助。

Web Workers 被定義萬維網(wǎng)聯(lián)盟(W3C)和網(wǎng)絡(luò)超文本應(yīng)用技術(shù)工作組(WHATWG),是一個 JavaScript 的腳本,從執(zhí)行的 HTML 頁面,在運行的背景,獨立腳本的可能也已經(jīng)從同一 HTML 頁面執(zhí)行。Web worker 通常能夠更有效地利用多核 CPU。

Web Workers

Web Worker 的作用,就是為 JavaScript 創(chuàng)造多線程環(huán)境,允許主線程創(chuàng)建 Worker 線程,將一些任務(wù)分配給后者運行。在主線程運行的同時,Worker 線程在后臺運行,兩者互不干擾。等到 Worker 線程完成計算任務(wù),再把結(jié)果返回給主線程。這樣的好處是,一些計算密集型或高延遲的任務(wù),被 Worker 線程負擔(dān)了,主線程(通常負責(zé) UI 交互)就會很流暢,不會被阻塞或拖慢。

Worker 線程一旦新建成功,就會始終運行,不會被主線程上的活動(比如用戶點擊按鈕、提交表單)打斷。這樣有利于隨時響應(yīng)主線程的通信。但是,這也造成了 Worker 比較耗費資源,不應(yīng)該過度使用,而且一旦使用完畢,就應(yīng)該關(guān)閉。

W3C 和 WHATWG 將 Web Worker 設(shè)想為長時間運行的腳本,這些腳本不會被響應(yīng)點擊或其他用戶交互的腳本打斷。防止此類工作人員受到用戶活動的干擾,應(yīng)該使網(wǎng)頁在后臺運行長任務(wù)的同時保持響應(yīng)速度。

worker 的最簡單用法是執(zhí)行計算量大的任務(wù),而不會中斷用戶界面。

Web Worker 為 Web 內(nèi)容在后臺線程中運行腳本提供了一種簡單的方法。線程可以執(zhí)行任務(wù)而不干擾用戶界面。此外,他們可以使用 XMLHttpRequest 執(zhí)行 I/O (盡管 responseXML 和 channel 屬性總是為空)。一旦創(chuàng)建, 一個 worker 可以將消息發(fā)送到創(chuàng)建它的 JavaScript 代碼, 通過將消息發(fā)布到該代碼指定的事件處理程序(反之亦然)。

Web Workers API

一個 worker 是使用一個構(gòu)造函數(shù)創(chuàng)建的一個對象(e.g. Worker()) 運行一個命名的 JavaScript 文件 – 這個文件包含將在工作線程中運行的代碼; workers 運行在另一個全局上下文中,不同于當(dāng)前的 window. 因此,使用 window 快捷方式獲取當(dāng)前全局的范圍 (而不是 self) 在一個 Worker 內(nèi)將返回錯誤。

在專用 workers 的情況下,DedicatedWorkerGlobalScope 對象代表了 worker 的上下文(專用 workers 是指標準 worker 僅在單一腳本中被使用;共享 worker 的上下文是 SharedWorkerGlobalScope 對象)。一個專用 worker 僅僅能被首次生成它的腳本使用,而共享 worker 可以同時被多個腳本使用。

在 worker 線程中你可以運行任何你喜歡的代碼,不過有一些例外情況。比如:在 worker 內(nèi),不能直接操作 DOM 節(jié)點,也不能使用 window 對象的默認方法和屬性。然而你可以使用大量 window 對象之下的東西,包括 WebSockets,IndexedDB 以及 FireFox OS 專用的 Data Store API 等數(shù)據(jù)存儲機制。查看 Functions and classes available to workers 獲取詳情。

workers 和主線程間的數(shù)據(jù)傳遞通過這樣的消息機制進行——雙方都使用 postMessage()方法發(fā)送各自的消息,使用 onmessage 事件處理函數(shù)來響應(yīng)消息(消息被包含在 Message 事件的 data 屬性中)。這個過程中數(shù)據(jù)并不是被共享而是被復(fù)制。

只要運行在同源的父頁面中,workers 可以依次生成新的 workers;并且可以使用 XMLHttpRequest 進行網(wǎng)絡(luò) I/O,但是 XMLHttpRequest 的 responseXML 和 channel 屬性總會返回 null。

專用 worker

如前文所述,一個專用 worker 僅僅能被生成它的腳本所使用。這一部分將探討 專用 worker 基礎(chǔ)示例 (運行專用 worker) 中的 JavaScript 代碼:將你輸入的 2 個數(shù)字作乘法。輸入的數(shù)字會發(fā)送給一個專用 worker,由專用 worker 作乘法后,再返回給頁面進行展示。

共享 worker

一個共享 worker 可以被多個腳本使用——即使這些腳本正在被不同的 window、iframe 或者 worker 訪問。這一部分,我們會討論共享 worker 基礎(chǔ)示例(運行共享 worker)中的 javascript 代碼:該示例與專用 worker 基礎(chǔ)示例非常相像,只是有 2 個可用函數(shù)被存放在不同腳本文件中:兩數(shù)相乘函數(shù),以及求平方函數(shù)。這兩個腳本用同一個 worker 來完成實際需要的運算。

關(guān)于線程安全

Worker 接口會生成真正的操作系統(tǒng)級別的線程,如果你不太小心,那么并發(fā)會對你的代碼產(chǎn)生有趣的影響。然而,對于 web worker 來說,與其他線程的通信點會被很小心的控制,這意味著你很難引起并發(fā)問題。你沒有辦法去訪問非線程安全的組件或者是 DOM,此外你還需要通過序列化對象來與線程交互特定的數(shù)據(jù)。所以你要是不費點勁兒,還真搞不出錯誤來。

以上就是關(guān)于Web Workers是什么及Web Workers有什么用這方面的一些信息了 小編整理的這些訊息希望對童鞋們有所幫助


免責(zé)聲明:本文由用戶上傳,如有侵權(quán)請聯(lián)系刪除!

最新文章

精彩推薦

圖文推薦

點擊排行

2016-2022 All Rights Reserved.平安財經(jīng)網(wǎng).復(fù)制必究 聯(lián)系QQ280 715 8082   備案號:閩ICP備19027007號-6

本站除標明“本站原創(chuàng)”外所有信息均轉(zhuǎn)載自互聯(lián)網(wǎng) 版權(quán)歸原作者所有。