1. 程式人生 > >進程,線程,Event Loop(事件循環),Web Worker

進程,線程,Event Loop(事件循環),Web Worker

ajax sel 並發執行 代碼 nbsp ima 方法 進入 時間設置

線程,是程序執行流的最小單位。線程可與同屬一個進程的其他線程共享所擁有的全部資源,同一進程中的多個線程之間可以並發執行。線程有就緒,阻塞,運行三種基本狀態。

阮一峰大神針對進程和線程的類比,很是形象:計算機的核心CPU,是個工廠,時刻運轉著,工廠裏有很多個車間(進程),一個車間開工其他車間不能開工,就是說:單核CPU一次只能運行一個進程。任何時候,CPU總是運行一個進程。

而一個車間裏面有很多工人(線程),協同完成一個任務。所以:一個進程可以包括多個線程。車間空間是工人共享的,一個進程中的內存空間是所有線程共享的。

但是房間大小不同個,容納量不同,有些線程進去了,其他線程就不能再進去使用了。這就是:一個線程使用某些共享內存時,其他線程得等它結束後才能使用共享內存。

內存可以上鎖,防止其他線程進來,【互斥鎖】也就是防止多個線程讀寫同一塊內存區域。

還有些共享內存比較大,可以容納多個線程,但是也是有限的,只能容納固定數目的線程使用。如何保證多個線程不沖突呢?內存門口有個鑰匙架,如果發現鑰匙架空了,那就不能再進去了【信號量】。

事件循環(Event Loop):

JavaScript是單線程的,單線程意味著需要一個任務隊列來管理任務事件,任務分為兩種:同步任務和異步任務。同步任務是在主線程上面排隊執行的任務,只有前面任務完成,下一個任務才能執行。異步任務是不進入主線程,而是進入任務隊列中,只有通知主線程某個異步任務可以執行了,該任務方可執行。

技術分享圖片

同步任務在主線程執行形成一個執行棧,主線程之外有個任務隊列(鼠標點擊事件,鍵盤點擊事件,網絡請求),只要異步任務觸發,在任務隊列中放置一個事件,等執行棧中同步任務完成後,系統才會讀取任務隊列執行異步任務。主線程會重復去任務隊列中讀取任務並執行——事件循環。

任務隊列是“先進先出”的數據結構,先來的優先被主線程讀取。

技術分享圖片

主線程運行產生堆heap和棧stack,棧裏面是各種同步方法,棧裏面代碼執行完畢主線程會讀取任務隊列,依次執行事件的回調函數。

所以,棧裏面的同步任務總是在任務隊列之前執行。

看個定時器的例子:

console.log(1);
setTimeout(function(){console.log(2);},0);
console.log(3);

定時器裏面的第二個參數延遲時間設置為0或者比0小的數,輸入都是1,3,2。因為console.log(1)和console.log(3)在主線程執行,而定時器是個異步任務放在了任務隊列裏面,只有棧中的同步事件清空後才能執行任務隊列中的回調函數。

setTimeout(fn,0)意思是:fn在主線程最早可得的空閑事件執行,但是也得等主線程的同步任務和任務列表中排在它前面的事件都處理完才能執行它。

要註意的點是:setTimeout裏面指定的延遲時間執行並不能保證就是那個時間執行,必須等到排在它之前的任務隊列中的回調函數執行完畢後才能執行它。

————————————————————————————————————————————————

JavaScript是單線程,H5中的Web Worker作用就是給js創造多線程環境,允許主線程創建Worker線程,將一些任務分配給Worker運行,主線程運行同時,Worker線程在後臺運行,互不幹擾。等Worker線程完成計算任務,再把結果返回給主線程。主線程(通常負責UI交互)就不用被異步隊列所打擾,運行就比較流暢。

使用Web Worker要註意的點:

1,同源限制:分配給Worker線程執行的腳本必須與主線程腳本同源。

2,DOM限制:Worker無法讀取ODM對象。

3,通信限制:Worker與主線程不在一個上下文環境,不能直接通信。

4,腳本限制:不能執行alert,confirm但是可以使用XHR發送Ajax請求。

5,文件限制:無法讀取本地文件,加載的腳本必須來源於網絡。

Worker線程使用完畢後,為了節省資源必須關閉Worker。

Web Worker有自己的全局對象,不是主線程的window對象,例如:self.name,self.onmessage等。

Worker的應用場景:輪詢。

這樣看來Web Worker其實就是主線程的一個子線程,幫忙處理一些任務隊列裏面的事件,分擔主線程的任務壓力。

【完】

只有不悲不喜的人,能當得起大喜大悲。也只有無所謂得失,不等待回音的人,能攀上人生的高峰。

進程,線程,Event Loop(事件循環),Web Worker