突襲HTML5之Javascript API擴充1—Web Worker非同步執行及相關概述_html5教學技巧
在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代碼:
腳本檔案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程式碼:
varworker = new SharedWorker('sharedworker.js');
var log = document.getElementById('response_from_worker');
worker.port.addeners(s. , function(e) {
//記錄網頁中的回應資料
log.textContent =e.data;
}, false);
worker.port.start();
worker.port.postMessage('從使用者網頁ping ..');
//以下方法會將使用者輸入傳送到sharedworker
function postMessageToSharedWorker(input)
{
//定義一個json物件來建構請求
var instructions={instruction:input.value };
worker.port.postMessage(指令);
}
腳本>
頭>
共享工作者範例:如何在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;
}
}
在上面的共享線程範例中,在主頁面即各個使用者連接頁面建構出一個共享線程對象,然後定義了一個方法 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

熱AI工具

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

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

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

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

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

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

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

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

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

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

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

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

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

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