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)歸原作者所有。
今天來(lái)說(shuō)一下關(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)該過(guò)度使用,而且一旦使用完畢,就應(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 代碼, 通過(guò)將消息發(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)行任何你喜歡的代碼,不過(guò)有一些例外情況。比如:在 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ù)傳遞通過(guò)這樣的消息機(jī)制進(jìn)行——雙方都使用 postMessage()方法發(fā)送各自的消息,使用 onmessage 事件處理函數(shù)來(lái)響應(yīng)消息(消息被包含在 Message 事件的 data 屬性中)。這個(gè)過(guò)程中數(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 訪問(wèn)。這一部分,我們會(huì)討論共享 worker 基礎(chǔ)示例(運(yùn)行共享 worker)中的 javascript 代碼:該示例與專用 worker 基礎(chǔ)示例非常相像,只是有 2 個(gè)可用函數(shù)被存放在不同腳本文件中:兩數(shù)相乘函數(shù),以及求平方函數(shù)。這兩個(gè)腳本用同一個(gè) worker 來(lái)完成實(shí)際需要的運(yùn)算。
關(guān)于線程安全
Worker 接口會(huì)生成真正的操作系統(tǒng)級(jí)別的線程,如果你不太小心,那么并發(fā)會(huì)對(duì)你的代碼產(chǎn)生有趣的影響。然而,對(duì)于 web worker 來(lái)說(shuō),與其他線程的通信點(diǎn)會(huì)被很小心的控制,這意味著你很難引起并發(fā)問(wèn)題。你沒(méi)有辦法去訪問(wèn)非線程安全的組件或者是 DOM,此外你還需要通過(guò)序列化對(duì)象來(lái)與線程交互特定的數(shù)據(jù)。所以你要是不費(fèi)點(diǎn)勁兒,還真搞不出錯(cuò)誤來(lái)。
以上就是關(guān)于Web Workers是什么及Web Workers有什么用這方面的一些信息了 小編整理的這些訊息希望對(duì)童鞋們有所幫助
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)歸原作者所有。