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

首頁 > 開發 > JavaScript > 正文

突襲HTML5之Javascript API擴展1—Web Worker異步執行及相關概述

2020-03-24 17:55:25
字體:
來源:轉載
供稿:網友
HTML 突襲HTML5之Javascript API擴展1—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文件的文件名傳給html' target='_blank'>構造函數就可以了。
線程通信
在主線程與子線程間進行通信,使用的是線程對象的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代碼:

復制代碼代碼如下:
!DOCTYPE HTML
html
head
meta http-equiv="Content-Type" content="text/html; charset=utf-8" /
title web worker fibonacci /title
script type="text/javascript"
onload = function(){
var worker = new Worker('fibonacci.js');
worker.onmessage = function(event) {
console.log("Result:" + event.data);
};
worker.onerror = function(error) {
console.log("Error:" + error.message);
};
worker.postMessage(40);
}
/script
/head
body
/body
/html

腳本文件fibonacci.js代碼:

復制代碼代碼如下:
//fibonacci.js
var fibonacci = function(n) {
return n 2 ? n : arguments.callee(n - 1) + arguments.callee(n - 2);
};
onmessage = function(event) {
var n = parseInt(event.data, 10);
postMessage(fibonacci(n));
};

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

復制代碼代碼如下:
worker.addEventListener('message', function(event) {
console.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.data.second;
calculate(first,second);
};
function calculate(first,second) {
//do the calculation work
var common_divisor=divisor(first,second);
var common_multiple=multiple(first,second);
postMessage("Work done! " +
"The least common multiple is " + common_divisor +
" and the greatest common divisor is "+common_multiple);
}

網上也有網友想到了利用這里的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代碼:

復制代碼代碼如下:
!DOCTYPE html
html
head
meta charset="UTF-8"
title Shared worker example: how to use shared worker in HTML5 /title
script
var worker = new SharedWorker('sharedworker.js');
var log = document.getElementById('response_from_worker');
worker.port.addEventListener('message', function(e) {
//log the response data in web page
log.textContent =e.data;
}, false);
worker.port.start();
worker.port.postMessage('ping from user web page..');
//following method will send user input to sharedworker
function postMessageToSharedWorker(input)
{
//define a json object to construct the request
var instructions={instruction:input.value};
worker.port.postMessage(instructions);
}
/script
/head
body onload=''
output id='response_from_worker'
Shared worker example: how to use shared worker in HTML5
/output
send instructions to shared worker:
input type="text" autofocus oninput="postMessageToSharedWorker(this);return false;"
/input
/body
/html

腳本文件代碼:

復制代碼代碼如下:
// 創建一個共享線程用于接收從不同連接發送過來的指令,指令處理完成后將結果返回到各個不同的連接用戶。
var connect_number = 0;
onconnect = function(e) {
connect_number =connect_number+ 1;
//get the first port here
var port = e.ports[0];
port.postMessage('A new connection! The current connection number is '
+ connect_number);
port.onmessage = function(e) {
//get instructions from requester
var instruction=e.data.instruction;
var results=execute_instruction(instruction);
port.postMessage('Request: '+instruction+' Response '+results
+' from shared worker...');
};
};
/*
* this function will be used to execute the instructions send from requester
* @param instruction
* @return
*/
function execute_instruction(instruction)
{
var result_value;
//implement your logic here
//execute the instruction...
return 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
phpstudy:http://www.phpstudy.net/w3school/html5/
WebWorker概述:http://developer.mozilla.org/en/Using_web_workershtml教程

鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯系我們修改或刪除,多謝。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产狼人综合免费视频| 亚洲色图35p| 日韩黄色在线免费观看| 欧美专区第一页| 欧美怡红院视频一区二区三区| 欧美福利视频网站| 午夜精品视频网站| 欧美亚洲一级片| 日韩国产高清污视频在线观看| 国产成人av在线播放| 98精品国产高清在线xxxx天堂| 欧美贵妇videos办公室| 高清一区二区三区日本久| 少妇av一区二区三区| 欧美成人精品xxx| 日韩欧美精品网址| 91麻豆国产精品| 91精品国产高清自在线| 日韩精品在线免费| 日本精品久久久久久久| 久久这里有精品视频| 国产精品v片在线观看不卡| 亚洲一区国产精品| 亚洲va电影大全| 国产精品69久久久久| 国产日韩欧美中文在线播放| 亚洲免费伊人电影在线观看av| 色综久久综合桃花网| 亚洲第一精品久久忘忧草社区| 亚洲国产私拍精品国模在线观看| 日韩欧美中文第一页| 久久手机免费视频| 亚洲免费福利视频| 亚洲欧美自拍一区| 欧美在线不卡区| 亚洲毛片在线免费观看| 久久乐国产精品| 国产91色在线|免| 国产精品露脸自拍| 成人在线免费观看视视频| 日本高清+成人网在线观看| 亚洲一级片在线看| 国产一区二区三区在线免费观看| 欧美日韩国产一区中文午夜| 色综合天天狠天天透天天伊人| 国产三级精品网站| 日韩在线观看精品| 亚洲一区二区三| 欧美中文在线观看国产| 亚洲电影免费观看高清完整版在线| 日韩经典一区二区三区| 中文字幕日韩欧美精品在线观看| 亚洲国产黄色片| 中文字幕精品一区二区精品| 亚洲色图35p| 欧美日韩亚洲激情| 久久久国产精彩视频美女艺术照福利| 日韩在线免费观看视频| 久久婷婷国产麻豆91天堂| 95av在线视频| 国产精品女主播| 国产精品一区二区三区在线播放| 日韩在线一区二区三区免费视频| 国产精品久久久久久久久久三级| 日韩av影视综合网| 国产主播欧美精品| 欧美精品激情视频| 96pao国产成视频永久免费| 精品久久久久久久久久| 国产精品美女在线| 久久97精品久久久久久久不卡| 综合网日日天干夜夜久久| 色悠久久久久综合先锋影音下载| 国产成人精品一区二区| 成人精品视频久久久久| 欧美另类老肥妇| 伊人激情综合网| 国产精品黄色影片导航在线观看| 在线观看免费高清视频97| 少妇高潮久久77777| 欧美精品video| 97视频免费在线观看| 欧美一级黄色网| 日本乱人伦a精品| 久久久久久国产| 91精品中国老女人| 国产精品丝袜久久久久久高清| 国产精品一区久久久| 亚洲精品福利在线观看| 国产欧美一区二区三区在线看| 九九热精品视频| 视频在线观看99| 91性高湖久久久久久久久_久久99| 亚洲自拍偷拍色片视频| 久久久噜噜噜久噜久久| 欧美日韩在线视频观看| 日韩av高清不卡| 日韩精品免费综合视频在线播放| 色妞一区二区三区| 国产专区精品视频| 乱亲女秽乱长久久久| 精品夜色国产国偷在线| 日韩av成人在线观看| 欧美日韩一区二区精品| 91wwwcom在线观看| 亚洲视频第一页| 日韩欧美在线视频日韩欧美在线视频| 亚洲综合大片69999| 另类色图亚洲色图| 亚洲v日韩v综合v精品v| 亚洲性av网站| 91免费福利视频| 欧美高清在线播放| 国产色婷婷国产综合在线理论片a| 国产91精品青草社区| 性欧美在线看片a免费观看| 欧美日产国产成人免费图片| 欧美极品在线视频| 日韩成人av网址| 一区国产精品视频| 黄色一区二区三区| 九九热r在线视频精品| 国产精品美女久久久久av超清| 日韩高清a**址| 欧亚精品在线观看| 久久久精品999| 国产精品久久久久久久电影| 日韩成人久久久| 亚洲精品国产suv| 亚洲欧美国产精品专区久久| 久久国产一区二区三区| 91精品久久久久久久久久另类| 国产亚洲欧美日韩精品| 精品动漫一区二区三区| 国产精品白嫩初高中害羞小美女| 日本久久精品视频| 久久久久久亚洲精品不卡| 欧美日韩午夜激情| 日韩av大片免费看| 中文字幕精品国产| 一区二区av在线| 国产精品第一视频| 久久99热精品这里久久精品| 日韩有码在线观看| www.久久久久| 欧美成人小视频| 亚洲视频777| 欧美电影电视剧在线观看| 欧美怡红院视频一区二区三区| 久久中文字幕在线| 91在线观看免费观看| 国产精品美女主播在线观看纯欲| 91亚洲永久免费精品| 国产做受69高潮| 亚洲在线免费观看| 日韩欧美精品在线观看| 欧美激情中文网| 日韩欧美一区二区三区久久| 欧美在线亚洲在线| 欧美孕妇与黑人孕交| 欧美日韩一区二区精品| 久久久久北条麻妃免费看| 亚洲mm色国产网站| 欧美成在线观看|