婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > HTML5之多線程(Web Worker)

HTML5之多線程(Web Worker)

熱門標簽:ai電銷機器人連接網關 濟南辦理400電話 農村住宅地圖標注 跟電銷機器人做同事 鄭州電銷外呼系統違法嗎 鶴壁手機自動外呼系統怎么安裝 漳州人工外呼系統排名 中紳電銷智能機器人 威海營銷外呼系統招商

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

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

一、明確 JavaScript 是單線程

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

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

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

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

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

二、新曙光:Web Worker

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

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

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

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

2.可以實現輪詢,改變某些狀態;

3.頁頭消息狀態更新,比如頁頭的消息個數通知;

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

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

6.預取數據:為了優化網站或者網絡應用及提升數據加載時間,你可以使用 Workers

來提前加載部分數據以備不時之需。

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

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

三、兼容性

四、基本概念

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

if (window.Worker) {
  ...
}

2.創建一個新的 worker 很簡單

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

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

3. postMessage 用來發送消息,而 onmessage 用來監聽消息

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

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

4.異常處理:

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

5.終止 worker

worker.terminate();

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

6.在 worker 線程中, workers 也可以調用自己的 close 方法進行關閉:

close();

五、快速開始

為了快速掌握,我們來做一個小例子:項目結構如下

├── 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('謝謝支持');
  }
};

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

web worker 收到消息,發現內容中含有「好」字,回傳給主線程:「謝謝支持」

六、局限性

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

這里舉個例子,我們修改 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('謝謝支持');
  }
};

這時候運行就會報出:

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

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

這個過程中數據并不是被共享而是被復制。

3.同源限制

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

4.文件限制

Worker 線程無法讀取本地文件,即不能打開本機的文件系統 (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.內容安全策略

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

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

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

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

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

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

七、擴展:WorkerGlobalScope

關于 ,我們可以在 MDN 上面找到文檔:

1. self

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

2. location

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

3. close

關閉當前線程,與 terminate 作用類似。

4. caches

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

5. console

支持 console 語法。

6. importScripts
我們可以通過 importScripts() 方法通過 urlworker 中加載庫函數。

7. XMLHttpRequest
有了它,才能發出 Ajax 請求。

8.可以使用:

  • setTimeout/setInterval
  • addEventListener/postMessage

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

八、異常處理

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

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

錯誤事件我們常用如下這三個關鍵信息:

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

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

標簽:紅河 甘南 惠州 蘇州 萍鄉 咸陽 文山 營口

巨人網絡通訊聲明:本文標題《HTML5之多線程(Web Worker)》,本文關鍵詞  HTML5,之多,線程,Web,Worker,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《HTML5之多線程(Web Worker)》相關的同類信息!
  • 本頁收集關于HTML5之多線程(Web Worker)的相關信息資訊供網民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    亚洲gay无套男同| 3d动漫精品啪啪| 国产麻豆午夜三级精品| 狠狠久久亚洲欧美| 久久精品国产成人一区二区三区| 日韩中文字幕区一区有砖一区| 亚洲资源中文字幕| 亚洲黄色性网站| 亚洲成人免费在线观看| 成人深夜视频在线观看| 国产成人午夜视频| 欧美一区二区三区四区高清| 欧美午夜精品一区二区三区| 欧美日韩午夜在线视频| 日韩一级在线观看| 欧美日韩一区二区三区四区五区 | 欧美妇女性影城| 一本大道久久精品懂色aⅴ| 国产欧美综合在线| 久久精品亚洲乱码伦伦中文| 久久久久久久久久久久久久久99| 精品国产a毛片| 一区在线播放视频| 亚洲成人av一区二区| 日韩avvvv在线播放| 国产伦精品一区二区三区免费迷 | 天使萌一区二区三区免费观看| 亚洲成人免费av| 国产一区二区三区国产| 波多野结衣中文一区| 欧美体内she精高潮| 26uuu亚洲婷婷狠狠天堂| 亚洲欧美综合在线精品| 日韩极品在线观看| 成人国产一区二区三区精品| 欧美三级日韩在线| 久久久99免费| 日韩电影在线观看网站| 不卡的av中国片| 欧美亚男人的天堂| 国产婷婷色一区二区三区四区| 亚洲一二三四区不卡| 国产精品亚洲综合一区在线观看| 91麻豆自制传媒国产之光| 欧美一区二区三区成人| 国产精品国产三级国产a| 免费观看在线色综合| 一本色道亚洲精品aⅴ| 亚洲精品一区二区三区影院| 亚洲一二三四在线| 成人国产精品免费观看| 亚洲精品一区二区三区香蕉| 天天综合色天天综合色h| 99这里只有久久精品视频| 日韩一区二区麻豆国产| 一区二区三区在线视频免费观看 | 美洲天堂一区二卡三卡四卡视频 | 日本一区二区三区在线不卡| 亚洲大片免费看| 欧美亚洲愉拍一区二区| 国产精品免费免费| 狠狠色综合色综合网络| 欧美成人福利视频| 日韩综合在线视频| 在线电影院国产精品| 一区二区三区欧美| 99国产麻豆精品| 综合av第一页| 99久久婷婷国产综合精品电影| 国产日韩av一区二区| 国产麻豆日韩欧美久久| 91精品国产综合久久久久久久| 亚洲国产成人tv| 欧美美女网站色| 午夜精品久久久久久久| 欧美精品成人一区二区三区四区| 亚洲国产另类av| 欧美日韩国产免费| 青青草国产成人av片免费| 91麻豆精品国产综合久久久久久 | 五月天亚洲精品| 欧美欧美午夜aⅴ在线观看| 午夜在线电影亚洲一区| 日韩一卡二卡三卡国产欧美| 久久99久久精品欧美| 日韩欧美色综合网站| 国产精品123| 中文字幕欧美一| 欧美日韩亚州综合| 精品在线观看视频| 国产欧美一区二区三区在线老狼 | 夜夜精品视频一区二区| 欧美日韩国产综合一区二区三区| 日韩精品1区2区3区| 欧美大片在线观看一区| 国产不卡视频一区二区三区| 日韩你懂的在线观看| 久久精品国产澳门| 国产日韩精品一区二区三区 | 国产成人免费9x9x人网站视频| 国产三级精品视频| 欧洲日韩一区二区三区| 黄色成人免费在线| 一区二区高清视频在线观看| 精品国产区一区| 91麻豆国产自产在线观看| 蜜臀av性久久久久蜜臀av麻豆| 久久九九国产精品| 欧美精三区欧美精三区| 成人中文字幕电影| 亚洲国产aⅴ天堂久久| 国产日韩欧美一区二区三区乱码| 在线日韩一区二区| 丁香激情综合国产| 热久久一区二区| 亚洲欧美日韩系列| 日韩美女天天操| 在线免费av一区| 成人免费看黄yyy456| 另类中文字幕网| ㊣最新国产の精品bt伙计久久| 国产伦精品一区二区三区免费| 日本道精品一区二区三区 | 91麻豆自制传媒国产之光| 一区二区三区资源| 欧美精品tushy高清| 色老汉av一区二区三区| 蜜臀久久99精品久久久久宅男| 国产精品欧美久久久久无广告| 欧美日韩精品一区二区天天拍小说| 午夜久久电影网| 亚洲综合偷拍欧美一区色| www久久精品| 一本大道av一区二区在线播放| 久久精品国产精品亚洲综合| 亚洲精品大片www| 精品久久久久久久久久久院品网| 91丨porny丨中文| 激情伊人五月天久久综合| 亚洲黄色性网站| 亚洲理论在线观看| 久久久久久久久久久电影| 欧美日韩一区国产| 国产成人精品影视| 亚洲成人综合网站| 亚洲午夜一区二区三区| 国产三级精品三级| 日韩一区二区三区电影在线观看 | 精品对白一区国产伦| 欧美午夜精品久久久久久超碰| 色噜噜夜夜夜综合网| 成人久久久精品乱码一区二区三区| 老司机精品视频导航| 午夜精品一区二区三区电影天堂| 日韩美女一区二区三区| 久久久99免费| 精品剧情在线观看| 欧美一区二区三区小说| 欧美精品成人一区二区三区四区| 91精品国产高清一区二区三区蜜臀| 色婷婷综合久久| 国产精品一区二区三区乱码| 日韩在线观看一区二区| 亚洲小说欧美激情另类| 日日夜夜精品视频免费| 精品区一区二区| 亚洲制服丝袜av| 日韩精品一区国产麻豆| 97久久精品人人做人人爽50路| 中文字幕一区二区三区四区不卡| 91麻豆免费视频| 亚洲国产aⅴ成人精品无吗| 精品裸体舞一区二区三区| www.日韩精品| 亚洲黄色片在线观看| 国产欧美日韩三级| 日韩一卡二卡三卡四卡| 日本aⅴ免费视频一区二区三区 | 99在线精品视频| 99在线精品免费| 在线观看国产日韩| 欧美精品色综合| 中文字幕av不卡| 一区二区三区鲁丝不卡| 亚洲电影在线免费观看| 免费xxxx性欧美18vr| 亚洲福利视频一区二区| 国产乱码精品一区二区三区av | 亚洲男女毛片无遮挡| 一区二区三区波多野结衣在线观看| 蜜臀精品久久久久久蜜臀| 国产精品1区2区3区在线观看| 高清成人免费视频| av中文字幕亚洲| 91传媒视频在线播放| 国产夜色精品一区二区av| 亚洲欧美另类小说视频| 奇米色一区二区三区四区| 国产高清亚洲一区| 欧美一区二区三区在线观看 |