亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > HTML > 正文

HTML5之多線程(Web Worker)

2024-08-26 00:21:15
字體:
供稿:網(wǎng)友

提到 HTML5 總是讓人津津樂道,太多的特性和有趣的 API 讓人耳目一新。但是很多童鞋還停留在語義化的階段,忽視了 HTML5 的強勁之處。

這節(jié)我們來探討一下多線程 Web-Worker。

一、明確 JavaScript 是單線程

JavaScript 語言的一大特點就是單線程,也就是說,同一個時間只能做一件事。

聽起來有些匪夷所思,為什么不設計成多線程提高效率呢?我們可以假設一種場景:

假定 JavaScript 同時有兩個線程,一個線程在某個 DOM 節(jié)點上添加內(nèi)容,另一個線程刪除了這個節(jié)點,這時瀏覽器應該以哪個線程為準?

作為瀏覽器腳本語言, JavaScript 的主要用途是與用戶互動,以及操作 DOM 。

這決定了它只能是單線程,否則會帶來很復雜的同步問題。為了避免復雜性,從一誕生, JavaScript 就是單線程,這已經(jīng)成了這門語言的核心特征,估計短期內(nèi)很難改變。

二、新曙光:Web Worker

單線程始終是一個痛點,為了利用多核 CPU 的計算能力, HTML5 提出 Web Worker 標準,允許 JavaScript 腳本創(chuàng)建多個線程。但是子線程完全受主線程控制,且不得操作 DOM 。

所以,這個新標準并沒有改變 JavaScript 單線程的本質(zhì)。

Web Workers 是現(xiàn)代瀏覽器提供的一個 JavaScript 多線程解決方案,我們可以找到很多使用場景:

1.我們可以用 Web Worker 做一些大計算量的操作;

2.可以實現(xiàn)輪詢,改變某些狀態(tài);

3.頁頭消息狀態(tài)更新,比如頁頭的消息個數(shù)通知;

4.高頻用戶交互,拼寫檢查,譬如:根據(jù)用戶的輸入習慣、歷史記錄以及緩存等信息來協(xié)助用戶完成輸入的糾錯、校正功能等

5.加密:加密有時候會非常地耗時,特別是如果當你需要經(jīng)常加密很多數(shù)據(jù)的時候(比如,發(fā)往服務器前加密數(shù)據(jù))。

6.預取數(shù)據(jù):為了優(yōu)化網(wǎng)站或者網(wǎng)絡應用及提升數(shù)據(jù)加載時間,你可以使用 Workers

來提前加載部分數(shù)據(jù)以備不時之需。

加密是一個使用 Web Worker 的絕佳場景,因為它并不需要訪問 DOM 或者利用其它魔法,它只是純粹使用算法進行計算而已。隨著大眾對個人敏感數(shù)據(jù)的日益重視,信息安全和加密也成為重中之重。這可以從近期的 12306 用戶數(shù)據(jù)泄露事件中體現(xiàn)出來。

一旦在 Worker 進行計算,它對于用戶來說是無縫地且不會影響到用戶體驗。

三、兼容性

HTML5,多線程

四、基本概念

1.首先記得去判斷是否支持

if (window.Worker) {  ...}

2.創(chuàng)建一個新的 worker 很簡單

const myWorker = new Worker('worker.js');

postMessage() 方法和 onmessage 事件處理函數(shù)是 Workers 的黑魔法。

3. postMessage 用來發(fā)送消息,而 onmessage 用來監(jiān)聽消息

const worker = new Worker('src/worker.js');worker.onmessage = e => {  console.log(e.data);};worker.postMessage('你好嗎!');

在主線程中使用時, onmessage 和 postMessage() 必須掛在 worker 對象上,而在 worker 中使用時不用這樣做。原因是,在 worker 內(nèi)部, worker 是有效的全局作用域。

4.異常處理:

worker.onerror = function(error) {  console.log(error.message);  throw error;};

5.終止 worker

worker.terminate();

worker 線程會被立即殺死,不會有任何機會讓它完成自己的操作或清理工作。

6.在 worker 線程中, workers 也可以調(diào)用自己的 close 方法進行關(guān)閉:

close();

五、快速開始

為了快速掌握,我們來做一個小例子:項目結(jié)構(gòu)如下

├── index.html└── src    ├── main.js    └── worker.js

Html

<html><head>  <title>Web Work Demo</title>  <meta charset="UTF-8" /></head><body>  <div id="app"> Hello Jartto! </div>  <script src="src/main.js"></script></body></html>

main.js

const worker = new Worker('src/worker.js');worker.onmessage = e => {  const message = e.data;  console.log(`[From Worker]: ${message}`);  document.getElementById('app').innerHTML = message;};worker.postMessage('寫的真好!');

Work.js

onmessage = e => {  const message = e.data;  console.log(`[From Main]: ${message}`);  if(message.indexOf('好') > -1) {    postMessage('謝謝支持');  }};

代碼很簡單,主線程發(fā)送:「寫的真好!」

web worker 收到消息,發(fā)現(xiàn)內(nèi)容中含有「好」字,回傳給主線程:「謝謝支持」

六、局限性

1.在 worker 內(nèi),不能直接操作 DOM 節(jié)點,也不能使用 window 對象的默認方法和屬性。然而我們可以使用大量 window 對象之下的東西,包括 WebSockets , IndexedDB 以及 FireFox OS 專用的 Data Store API 等數(shù)據(jù)存儲機制。

這里舉個例子,我們修改 main.js :

const worker = new Worker('src/worker.js');worker.onmessage = e => {  const message = e.data;  console.log(`[From Worker]: ${message}`);  document.getElementById('app').innerHTML = message;};+ worker.onerror = function(error) {+   console.log(error);+   worker.terminate();+ };worker.postMessage('寫的真好!');

再來修改 work.js

+ alert('jartto');onmessage = e => {  const message = e.data;  console.log(`[From Main]: ${message}`);  if(message.indexOf('好') > -1) {    postMessage('謝謝支持');  }};

這時候運行就會報出:

HTML5,多線程

這是因為: worker.js 執(zhí)行的上下文,與主頁面 HTML 執(zhí)行時的上下文并不相同,最頂層的對象并不是 Window, woker.js 執(zhí)行的全局上下文,而是 WorkerGlobalScope ,我們具體說明。

2. workers 和主線程間的數(shù)據(jù)傳遞通過這樣的消息機制進行:雙方都使用 postMessage() 方法發(fā)送各自的消息,使用 onmessage 事件處理函數(shù)來響應消息(消息被包含在 Message 事件的 data 屬性中)。

這個過程中數(shù)據(jù)并不是被共享而是被復制。

3.同源限制

分配給 Worker 線程運行的腳本文件,必須與主線程的腳本文件同源。

4.文件限制

Worker 線程無法讀取本地文件,即不能打開本機的文件系統(tǒng) (file://) ,它所加載的腳本,必須來自服務器。

5.不允許本地文件

Uncaught SecurityError: Failed to create a worker: 
script at '(path)/worker.js' 
cannot be accessed from origin 'null'.

Chrome doesn’t let you load web workers when running scripts from a local file.

那如何解決呢?我們可以啟動一個本地服務器,建議使用 http-server ,簡單易用。

6.內(nèi)容安全策略

有別于創(chuàng)建它的 document 對象, worker 有它自己的執(zhí)行上下文。因此普遍來說, worker 并不受限于創(chuàng)建它的 document (或者父級 worker )的內(nèi)容安全策略。

我們來舉個例子,假設一個 document 有如下頭部聲明:

Content-Security-Policy: script-src 'self'

這個聲明有一部分作用在于,禁止它內(nèi)部包含的腳本代碼使用 eval() 方法。然而,如果腳本代碼創(chuàng)建了一個 worker ,在 worker 上下文中執(zhí)行的代碼卻是可以使用 eval() 的。

為了給 worker 指定 CSP,必須為發(fā)送 worker 代碼的請求本身加上一個 CSP。

有一個例外情況,即 worker 腳本的源如果是一個全局性的唯一的標識符(例如,它的 URL 指定了數(shù)據(jù)模式或者 blob ), worker 則會繼承創(chuàng)建它的 document 或者 worker 的 CSP 。

七、擴展:WorkerGlobalScope

關(guān)于 ,我們可以在 MDN 上面找到文檔:

1. self :

我們可以使用 WorkerGlobalScope 的 self 屬性來獲取這個對象本身的引用。

2. location :

location 屬性返回當線程被創(chuàng)建出來的時候與之關(guān)聯(lián)的 WorkerLocation 對象,它表示用于初始化這個工作線程的腳步資源的絕對 URL ,即使頁面被多次重定向后,這個 URL 資源位置也不會改變。

3. close :

關(guān)閉當前線程,與 terminate 作用類似。

4. caches :

當前上下文得 CacheStorage ,確保離線可用,同時可以自定義請求的響應。

5. console :

支持 console 語法。

6. importScripts 
我們可以通過 importScripts() 方法通過 url 在 worker 中加載庫函數(shù)。

7. XMLHttpRequest 
有了它,才能發(fā)出 Ajax 請求。

8.可以使用:

  • setTimeout/setInterval
  • addEventListener/postMessage

還有很多 API 可以使用,這里就不一一舉例了。

八、異常處理

當 worker 出現(xiàn)運行中錯誤時,它的 onerror 事件處理函數(shù)會被調(diào)用。它會收到一個擴展了 ErrorEvent 接口的名為 error 的事件。該事件不會冒泡并且可以被取消。

為了防止觸發(fā)默認動作,worker 可以調(diào)用錯誤事件的 preventDefault() 方法。

錯誤事件我們常用如下這三個關(guān)鍵信息:

  • Message:可讀性良好的錯誤消息;
  • Filename:發(fā)生錯誤的腳本文件名;
  • Lineno:發(fā)生錯誤時所在腳本文件的行號;
worker.onerror = function(error) {  console.log(error.message);  throw error;};

以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持VeVb武林網(wǎng)。


注:相關(guān)教程知識閱讀請移步到HTML教程頻道。
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
成人黄页在线观看| 天天影视色香欲综合网老头| 国产日韩欧美久久| 深夜福利免费在线观看| 欧美wwww| 99精品国产99久久久久久白柏| 亚洲 日韩 国产第一| 狠狠狠色丁香婷婷综合久久五月| 国产综合在线播放| 国产成人高清激情视频在线观看| 91综合网人人| 一区二区高清视频在线观看| 91免费综合在线| 美女爆乳18禁www久久久久久| 午夜久久黄色| 日韩视频在线观看免费| 天堂中文在线资源| 欧美亚洲另类视频| 天天综合网网欲色| 亚洲国产你懂的| 91免费版黄色| 伊人久久噜噜噜躁狠狠躁| 在线看无码的免费网站| 狠狠色噜噜狠狠狠狠8888| 国产日韩欧美制服另类| 亚洲天堂第一区| 男人插女人视频在线观看| 上原亚衣av一区二区三区| 亚洲成人av电影在线| 日韩精品人妻中文字幕| 丰满少妇在线观看资源站| 免费在线观看国产精品| 久久久噜噜噜久噜久久综合| 欧美日韩午夜视频| 亚洲午夜精品一区二区三区| a级精品国产片在线观看| 精品亚洲免费视频| 国产精品酒店视频| 久久9999久久免费精品国产| 洋洋成人永久网站入口| 91精品国产亚洲| 国产在线观看黄| www.日韩| 日韩人在线观看| 色综合激情五月| 成人三级毛片| 国产亚洲精品久久久网站好莱| 欧美成人女星排行榜| 久久久久国产精品熟女影院| 日韩欧美国产午夜精品| 日韩电影中文字幕在线观看| 一区二区三区在线视频播放| 日韩毛片在线免费观看| 久久精品亚洲精品国产欧美kt∨| 国产精品自拍网| 亚洲一区亚洲二区亚洲三区| 2024最新电影免费在线观看| 欧美电影《睫毛膏》| 欧美偷窥清纯综合图区| 极品尤物av丝袜美腿在线观看| 四虎精品成人影院观看地址| 秋霞影院一区二区| www.大网伊人| 久热精品视频在线免费观看| 国产欧美一区二区三区米奇| 免费一级黄色录像| av资源网在线观看| 蜜臀久久99精品久久久久久| 亚洲电影欧美电影有声小说| а 天堂 在线| 亚洲精品中文字幕乱码三区不卡| 日韩av有码在线| 国产精品美女久久久久久免费| 精品视频在线免费观看| 久久福利视频网| 日韩精品中文字幕在线不卡尤物| 国产精品久久久久999| 亚洲欧洲一二三| 无码国产精品一区二区色情男同| 欧美一区二区视频17c| 久久偷看各类女兵18女厕嘘嘘| 青青青视频在线播放| 精品人妻伦九区久久aaa片| 国产精品人人人人| 国产嫩草影院久久久久| 第一福利在线视频| 亚洲精品乱码久久久久| 国产成人97精品免费看片| 裸体av在线| 亚洲精品少妇| 美女的诞生在线观看高清免费完整版中文| 色呦哟—国产精品| 欧美视频一区二区在线| 处破女av一区二区| 久久久亚洲欧洲日产国码aⅴ| 亚洲国产精品一区二区久久hs| 国产精选一区二区| 亚洲免费国产| 日本成人在线免费| 青青视频在线观| 亚洲欧美成人一区二区三区| 国产精品人人妻人人爽人人牛| 免费资源在线观看| 国产一级在线观看视频| 久久一区二区三区视频| 超碰在线观看免费版| 狠狠躁夜夜躁av无码中文幕| 亚洲sss视频| 在线中文字幕视频观看| 先锋影音男人站| 国产精品乱码久久久久| 日日摸夜夜添一区| 91精品国产自产在线| 国产二区三区在线| 欧美aa一级| 日韩性xxxx| 国产精品免费网站| 亚洲性日韩精品一区二区| 日韩免费电影在线观看| 污视频网站免费| mm视频在线视频| 99久久久无码国产精品性| 国产色综合一区| 欧美jizz| 黄色免费观看网站| 亚洲二区三区四区| 亚洲图片有声小说| 亚洲大胆人体大胆做受1| 日韩视频一区二区三区在线播放免费观看| 亚洲精品一级二级三级| 欧美一区二区性放荡片| 久久影院一区二区| 成人黄色激情视频| 亚洲国产福利在线| 国产福利小视频在线观看| 国产成人精品免费视频| 中文字幕avav| 超碰porn在线| av片哪里在线观看| 美国黄色一级毛片| 神马午夜一区二区| 日本三级中文字幕| 久久夜色精品亚洲| 中文字幕日本乱码精品影院| 天天插天天射天天干| 91麻豆精品国产91久久久久| 萌白酱视频在线| 日本少妇吞精囗交| 精品午夜一区二区三区在线观看| 日本三级免费网站| 最新91视频| 成年人深夜视频| av一区二区久久| av网站在线免费播放| 国产精品视频久久久久| 国产黄色一区二区| 中文字幕三级电影| 精品欧美国产一区二区三区| 日本视频在线免费| 欧美一级搡bbbb搡bbbb| 国产麻豆视频一区二区| 无码人妻av一区二区三区波多野| 日韩精品一区二区三区四区| 国产激情二区| 日本精品久久久久中文字幕| 国产麻豆xxxvideo实拍| jizzjizzjizz美国| 懂色av粉嫩av蜜乳av| 91精品免费在线观看| 在线免费高清一区二区三区| 九九热在线观看| bl在线肉h视频大尺度| 成人vr资源| 欧美亚洲黄色片| 国产亚洲欧美日韩精品一区二区三区| 91成人福利在线观看| 草莓视频末满18勿| 久久久久久日产精品| 美女福利视频一区| 激情黄色小视频| 免费电影网站在线视频观看福利| 激情在线小视频| caoporm免费视频在线| 久久久久狠狠高潮亚洲精品| 久久免费看视频| 久久久久亚洲AV成人网人人小说| 一区二区三区www| 丰满熟女人妻一区二区三区| 亚洲欧美日韩一区在线观看| 麻豆一区二区99久久久久| 日韩三级视频在线看| 激情小说网站亚洲综合网| 国产精品乱人伦| 日韩中文欧美在线| 国产一区二区网| 亚洲品质自拍视频网站| 97视频com| h视频免费在线| 香蕉视频911| 受虐m奴xxx在线观看| 一区二区三区小视频| 一区二区中文字幕在线| 中国极品少妇videossexhd| 亚洲精品不卡| 日韩大片免费观看| 国产亚洲精品美女久久久久| 欧美性高跟鞋xxxxhd| 久久午夜鲁丝片| 美女胸又www又黄的网站| 亚洲美女免费精品视频在线观看| 精品女同一区二区三区在线观看| 狠狠爱www人成狠狠爱综合网| 亚洲影视资源| 中文一区一区三区免费| 色呦呦在线免费观看| 亚洲欧美综合在线观看| 亚洲综合在线中文字幕| 亚洲欧美国产va在线影院| 色婷婷av久久久久久久| 色爱综合区网| 国产在线精品一区在线观看麻豆| 日本精品在线观看视频| 欧美日一区二区| 色综合亚洲欧洲| 麻豆一区二区三区在线观看| 毛片电影在线| 亚洲精品成人图区| 日本成人不卡| 国产福利一区二区三区| 中文字幕一区二区三区乱码在线| 国产一级一级片| 91高清免费看| 国产精品三级久久久久三级| 男人天堂视频在线| 成人h动漫精品一区二| 99免费在线观看| 日本精品久久久| 欧美俄罗斯乱妇| 免费日本一区二区三区视频| 久草中文在线观看| 国产精品538一区二区在线| 久久精品国产亚洲5555| 亚洲国产视频二区| 国产福利免费在线观看| 偷拍亚洲欧洲综合| 999福利在线视频| 97精品高清一区二区三区| 国产美女裸体无遮挡免费视频| 欧美在线看片a免费观看| 黄色网址大全在线观看| 91亚洲精品一区| 亚洲男人第一网站| 国产一区二区高清在线| 天天干天天舔| 欧美深夜福利| 日韩视频免费中文字幕| 99视频在线免费| 日韩精品日韩在线观看| 91免费在线播放视频| 不卡在线观看av| 你懂的网址国产 欧美| 久久97精品久久久久久久不卡| 美日韩在线观看| 国产精品初高中害羞小美女文| 亚洲欧美视频一区| 久久国产中文字幕| 日韩一级高清毛片| 国产一区二区伦理| 久久电影国产免费久久电影| 日韩欧美亚洲区| 少妇精69xxtheporn| 久久久国产精品一区二区三区| 国产一级在线播放| 久久综合久久鬼| 国产精品九九九| 亚洲精品无amm毛片| 亚洲精品欧美激情| 欧美天堂亚洲电影院在线播放| 久久久久久久久久久成人| 韩国成人福利片在线播放| 欧美视频网站| 岛国影视在线观看| 在哪里可以看毛片| 日韩专区在线| 中文在线аv在线| 国产精品露脸自拍| 人人妻人人澡人人爽| 欧美三级超在线视频| 激情久久av| 日本在线观看网址| 99久久99九九99九九九| 久久精品无码av| 久久中文字幕一区二区三区| 大又大又粗又硬又爽少妇毛片| 超清福利视频| 国产iv一区二区三区| 国产日韩一区二区三区在线播放| 国产九九精品| 久久夜夜久久| av黄在线观看| 国产精品一区二区亚洲| 99re在线视频| 国产成人精品久久二区二区| 亚洲无码精品国产| 国内自拍偷拍视频| 日本美女高潮视频| 午夜欧美一区二区三区免费观看| 乱老熟女一区二区三区| 欧美激情视频三区| 亚洲美女福利视频| 日韩av综合网站| 国产成人精品免高潮在线观看| 免费视频一区三区| 亚洲国产另类久久久精品极度| 国产精品传媒精东影业在线| 粉嫩的18在线观看极品精品| 国产成人免费xxxxxxxx| 国产无遮挡猛进猛出免费软件| 免费亚色电影在线观看| 91在线播放观看| 成人免费视频91| 亚洲精品tv久久久久久久久久| 久久久久久免费看| 欧美丰满少妇xxxxx| 免费电影网站在线视频观看福利| 91亚洲一区精品| 久久aⅴ乱码一区二区三区| 国产在线日韩欧美|