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

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

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

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

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

Web Workers

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

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

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

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

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

Web Workers API

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

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

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

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

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

專用 worker

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

共享 worker

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

關(guān)于線程安全

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

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


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

最新文章

精彩推薦

圖文推薦

點(diǎn)擊排行

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

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