首頁 web前端 H5教程 突襲HTML5之Javascript API擴充1—Web Worker非同步執行及相關概述_html5教學技巧

突襲HTML5之Javascript API擴充1—Web Worker非同步執行及相關概述_html5教學技巧

May 16, 2016 pm 03:50 PM
web worker

Javascript執行機制
在HTML5之前,瀏覽器中JavaScript的運作都是以單執行緒的方式運作的,雖然有多種方式實作了對多執行緒的模擬(例如:Javascript 中的setinterval 方法,setTimeout 方法等),但是本質上程式的運作仍然是由JavaScript 引擎以單執行緒調度的方式進行的。在 HTML5 中引入的工作線程使得瀏覽器端的 Javascript 引擎可以並發地執行 Javascript 程式碼,從而實現了對瀏覽器端多執行緒程式設計的良好支援。

Javascript中的多執行緒 - WebWorker
HTML5 中的 Web Worker 可以分為兩種不同執行緒類型,一個是專用執行緒 Dedicated Worker,一個是共享執行緒 Shared Worker。兩種類型的線程各有不同的用途。
專用型web worker
專用型worker與創建它的腳本連接在一起,它可以與其他的worker或是瀏覽器組件通信,但是他不能與DOM通信。專用的含義,我想就是這個線程一次只處理一個需求。專用線程在除了IE外的各種主流瀏覽器中都實現了,可以放心使用。
建立執行緒
建立worker很簡單,只要把需要在執行緒執行的JavaScript檔案的檔案名稱傳給建構子就可以了。
執行緒通訊
在主執行緒與子執行緒間進行通信,使用的是執行緒物件的postMessage和onmessage方法。不管是誰向誰發送數據,發送使用的都是postMessage方法,接收方都是使用onmessage方法接收數據。 postMessage只有一個參數,那就是傳遞的數據,onmessage也只有一個參數,假設為event,則透過event.data取得收到的數據。
發送JSON資料
JSON是JS原生支援的東西,不用白不用,複雜的資料就用JSON傳送吧。例如:

複製程式碼
程式碼如下:

postMessage({'cmd': 'init', 'timestamp': Date.now()});

處理錯誤
當執行緒發生錯誤的時候,它的onerror事件回呼會被調用。所以處理錯誤的方式很簡單,就是掛接執行緒實例的onerror事件。這個回呼函數有一個參數error,這個參數有3個欄位:message - 錯誤訊息;filename - 發生錯誤的腳本檔案;lineno - 發生錯誤的行。
銷毀執行緒
在執行緒內部,使用close方法執行緒自己銷毀自己。在執行緒外部的主執行緒中,使用執行緒實例的terminate方法銷毀執行緒。
下面從一個例子看線程的基本操作:
HTML代碼:

複製代碼
代碼如下:





web worker fibonacci






腳本檔案fibonacci.js程式碼:

複製代碼
代碼如下:

//fibonacci.js
var fibonacci = function(n) {
return n };
onmessage = function(event) {
var n = parseInt(event.data, 10) ;
postMessage(fibonacci(n));
};

把它們放到相同的目錄,運行頁面文件,查看控制台,可以看到運行的結果。
這裡還有一點,在主執行緒中,onmessage事件可以用另一種方​​式掛接:

複製程式碼
程式碼如下:

worker.addEventListener('message', function(event) {
console.log("Result:" event.data);
}, falseole.log("Result:" event.data);
}, false );

個人覺得很麻煩,不如用onmessage直接。
使用其他腳本檔案
工作執行緒可以使用全域方法importScripts來載入和使用其他的網域內腳本檔案或類別庫。例如下面都是合法的使用方式:

複製代碼
代碼如下:

importScripts();/* imports nothing */
importScripts('foo.js'); /* imports just "foo.js" */
importScripts('foo.js', 'bar.js') ;/* imports two scripts */

匯入以後,可以直接使用這些檔案中的方法。看一個網上的小例子:

複製代碼
代碼如下:

/* *
* 使用 importScripts 方法引入外部資源腳本,在這裡我們使用了數學公式計算工具庫 math_utilities.js
* 當 JavaScript 引擎對這個資源檔案載入完畢後,繼續執行下面的程式碼。同時,下面的程式碼可以存取和呼叫
* 在資源檔案中定義的變數和方法。
**/
importScripts('math_utilities.js');
onmessage = function (event)
{
var first = event.data.first;
var second = event first = event.data.first;
var second = event event second .data.second;
calculate(first,second);
};
function calculate(first,second) {
//do the calculation work
var _difvisorst. second);
var common_multiple=multiple(first,second);
postMessage("Work done! "
"The least common multiple is " common_divisor
"The least common multiple is " common_divisor
" grmeat plescom ;
}

網上也有網友想到了利用這裡的importScripts方法解決資源預加載的問題(瀏覽器預先加載資源,而不會對資源進行解析和執行),道理也很簡單。
線程嵌套
在工作線程中還可以在創建子線程,各種操作還是一樣的。
同步問題
Worker沒有鎖定的機制,多執行緒的同步問題只能靠程式碼來解決(例如定義訊號變數)。
共享型SharedWebWorker

共享型web worker主要適用於多連接並發的問題。因為要處理多連接,所以它的API與專用型worker稍微有點區別。除了這一點,共享型web worker和專用型worker一樣,不能存取DOM,並且對窗體屬性的存取也受到限制。共享型web worker也不能跨越通訊。
頁面腳本可以與共享型web worker通信,然而,與專用型web worker(使用了一個隱式的端口通信)稍微有點不同的是,通信是顯式的通過使用一個端口(port)對象並附加上一個訊息事件處理程序來進行的。
收到web worker腳本的首個訊息之後,共享型web worker把一個事件處理程序附加到啟動的連接埠。一般情況下,處理程序會執行自己的postMessage()方法來把一個訊息回傳給呼叫程式碼,接著連接埠的start()方法產生一個有效的訊息進程。
看網路上能找到的唯一個例子:建立一個共享執行緒用來接收從不同連線發送過來的指令,然後實作自己的指令處理邏輯,指令處理完成後將結果傳回各個不同的連線使用者。
HTML程式碼:
複製程式碼
程式碼如下:





共用工作者範例:如何在HTML5 中使用共用工作者 title> <br> <br>varworker = new SharedWorker('sharedworker.js'); <br>var log = document.getElementById('response_from_worker'); <br>worker.port.addeners(s. , function(e) { <br>//記錄網頁中的回應資料<br>log.textContent =e.data; <br>}, false); <br>worker.port.start(); <br> worker.port.postMessage('從使用者網頁ping ..'); <br>//以下方法會將使用者輸入傳送到sharedworker <br>function postMessageToSharedWorker(input) <br>{ <br>//定義一個json物件來建構請求<br>var instructions={instruction:input.value }; <br>worker.port.postMessage(指令); <br>} <br>腳本> <br>頭> <br> ;

共享工作者範例:如何在HTML5 中使用共享工作者

向共享工作人員傳送指令:

輸入>
身體>


腳本文件代碼:

複製代碼
代碼如下:

//建立一個共享執行緒用於接收從不同連線發送過來的指令,指令處理完成後將結果傳回各個不同的連線使用者。
var connect_number = 0;
onconnect = function(e) {
connect_number =connect_number 1;
//在這裡取得第一個連接埠
var port = e.ports[0] ;
port.postMessage('一個新連接!目前連接號為'
connect_number);
port.onmessage = function(e) {
//取得請求者的指令
var instructions=e.data.instruction;
var results=execute_instruction(指令);
port.postMessage('請求:'指令'回應'結果
'來自共享工作者...');
};
};
/*
* 此函數將用於執行請求者發送的指令
* @param instructions
* @return
*/
functionexecute_instruction(instruction)
{
var result_value;
//在這裡實作你的邏輯
//執行指令...
返回result_value;
}
}
返回result_value; >
在上面的共享線程範例中,在主頁面即各個使用者連接頁面建構出一個共享線程對象,然後定義了一個方法 postMessageToSharedWorker 向共享線程發送來之用戶的指令。同時,在共享執行緒的實作程式碼片段中定義 connect_number 用來記錄連接到這個共享執行緒的總數。之後,用 onconnect 事件處理器接受來自不同使用者的連接,解析它們傳遞過來的指令。最後,定義了一個方法 execute_instruction 用來執行使用者的指令,指令執行完成後將結果傳回給各個使用者。

這裡我們並沒有跟前面的例子一樣使用到了工作線程的 onmessage 事件處理器,而是使用了另外一種方式 addEventListener。實際上,前面已經說過,這兩種的實作原理基本上一致,只是在這裡有些稍微的差別,如果使用到了addEventListener 來接受來自共享線程的訊息,那麼就要先使用worker.port.start() 方法來啟動這個連接埠。之後就可以像工作線程的使用方式一樣正常的接收和發送訊息。
最後陳述
線程中能做的事
1.能使用setTimeout(), clearTimeout(), setInterval(),clearInterval()等函數。
2.能使用navigator物件。
3.能使用XMLHttpRequest來發送請求。
4.可以在執行緒使用Web Storage。
5.執行緒中可以用self取得本執行緒的作用域。
線程中不能做的事
1.線程中是不能使用除navigator外的DOM/BOM對象,例如window,document(想要操作的話只能發送訊息給worker創建者,透過回調函數操作)。
2.執行緒中不能使用主執行緒中的變數和函數。
3.執行緒中不能使用有"掛起"效果的操作指令,例如alert等。
4.執行緒中不能跨域載入JS。
線程也是需要消耗資源的,而且使用線程也會帶來一定的複雜性,所以如果沒有充足的理由來使用額外的線程的話,那麼就不要用它。
實用參考
官方文件:http://www.whatwg.org/specs/web-apps/current-work/multipage/workers.html
WebWorker分類說明:http://www.w3schools.com/html5/html5_webworkers.asp
腳本之家:http://www.jb51.net/w3school/html5/
WebWorker概述:https://developer.mozilla.org/en/Using_web_workers
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

如何使用python+Flask實作日誌在web網頁即時更新顯示 如何使用python+Flask實作日誌在web網頁即時更新顯示 May 17, 2023 am 11:07 AM

一、日誌輸出到檔案使用模組:logging可以產生自訂等級日誌,可以輸出日誌到指定路徑日誌等級:debug(偵錯日誌)=5){clearTimeout(time)//如果連續10次取得的都是空日誌清除定時任務}return}if(data.log_type==2){//如果取得到新日誌for(i=0;i

Nginx的Web伺服器caddy怎麼使用 Nginx的Web伺服器caddy怎麼使用 May 30, 2023 pm 12:19 PM

Caddy簡介Caddy是一款功能強大,擴展性高的Web伺服器,目前在Github上已有38K+Star。 Caddy採用Go語言編寫,可用於靜態資源託管和反向代理。 Caddy具有以下主要特性:比較Nginx複雜的配置,其獨創的Caddyfile配置非常簡單;可以透過其提供的AdminAPI實現動態修改配置;預設支援自動化HTTPS配置,能自動申請HTTPS憑證並進行配置;能夠擴展到數以萬計的站點;可以在任意地方執行,沒有額外的依賴;採用Go語言編寫,內存安全更有保證。安裝首先我們直接在CentO

如何使用Golang實作網頁應用程式的表單驗證 如何使用Golang實作網頁應用程式的表單驗證 Jun 24, 2023 am 09:08 AM

表單驗證是Web應用程式開發中非常重要的環節,它能夠在提交表單資料之前對資料進行有效性檢查,避免應用程式出現安全漏洞和資料錯誤。使用Golang可以輕鬆實現網頁應用程式的表單驗證,本文將介紹如何使用Golang來實作網頁應用程式的表單驗證。一、表單驗證的基本要素在介紹如何實作表單驗證之前,我們需要知道表單驗證的基本要素是什麼。表單元素:表單元素是指

Java API 開發中使用 Jetty7 進行 Web 伺服器處理 Java API 開發中使用 Jetty7 進行 Web 伺服器處理 Jun 18, 2023 am 10:42 AM

JavaAPI開發中使用Jetty7進行Web伺服器處理隨著互聯網的發展,Web伺服器已經成為了應用程式開發的核心部分,同時也是許多企業所關注的焦點。為了滿足日益增長的業務需求,許多開發人員選擇使用Jetty進行Web伺服器開發,其靈活性和可擴展性受到了廣泛的認可。本文將介紹如何在JavaAPI開發中使用Jetty7進行We

怎麼設定nginx保證frps伺服器與web共用80埠 怎麼設定nginx保證frps伺服器與web共用80埠 Jun 03, 2023 am 08:19 AM

首先你會有個疑惑,frp是什麼呢?簡單的說frp就是內網穿透工具,配置客戶端以後,可以透過伺服器來存取內部網路。現在我的伺服器,已經用nginx做站了,80端口只有一個,那如果frp的服務端也想使用80端口,那該怎麼辦呢?經過查詢,這個是可以實現的,就是利用nginx的反向代理來實現。補充一下:frps就是伺服器端(server),frpc就是客戶端(client)。第一步:修改伺服器中nginx.conf設定檔在nginx.conf中http{}裡加入以下參數,server{listen80

Web 端即時防擋臉彈幕(基於機器學習) Web 端即時防擋臉彈幕(基於機器學習) Jun 10, 2023 pm 01:03 PM

防擋臉彈幕,即大量彈幕飄過,但不會遮擋視訊畫面中的人物,看起來像是從人物背後飄過去的。機器學習已經火了好幾年了,但很多人都不知道瀏覽器中也能運行這些能力;本文介紹在視頻彈幕方面的實踐優化過程,文末列舉了一些本方案可適用的場景,期望能開啟一些腦洞。 mediapipeDemo(https://google.github.io/mediapipe/)展示主流防擋臉彈幕實現原理點播up上傳視訊伺服器後台計算提取視訊畫面中的人像區域,轉換成svg儲存用戶端播放視訊的同時,從伺服器下載svg與彈幕合成,人像

web標準是什麼東西 web標準是什麼東西 Oct 18, 2023 pm 05:24 PM

Web標準是一組由W3C和其他相關組織制定的規範和指南,它包括HTML、CSS、JavaScript、DOM、Web可訪問性和性能優化等方面的標準化,透過遵循這些標準,可以提高頁面的兼容性、可訪問性、可維護性和效能。 Web標準的目標是使Web內容能夠在不同的平台、瀏覽器和裝置上一致地展示和交互,提供更好的使用者體驗和開發效率。

如何從駕駛艙Web使用者介面啟用管理訪問 如何從駕駛艙Web使用者介面啟用管理訪問 Mar 20, 2024 pm 06:56 PM

Cockpit是一個面向Linux伺服器的基於Web的圖形介面。它主要是為了使新用戶/專家用戶更容易管理Linux伺服器。在本文中,我們將討論Cockpit存取模式以及如何從CockpitWebUI切換Cockpit的管理存取。內容主題:駕駛艙進入模式查找當前駕駛艙訪問模式從CockpitWebUI啟用Cockpit的管理訪問從CockpitWebUI禁用Cockpit的管理訪問結論駕駛艙進入模式駕駛艙有兩種訪問模式:受限訪問:這是駕駛艙的默認訪問模式。在這種存取模式下,您無法從駕駛艙Web用戶

See all articles