單線程,同步異步,阻塞非阻塞的理解

一.概念理解編程

1.同步異步:segmentfault

同步和異步關注的是消息通訊機制 (synchronous communication/ asynchronous communication)所謂同步,就是在發出一個*調用*時,在沒有獲得結果以前,該*調用*就不返回。可是一旦調用返回,就獲得返回值了。換句話說,就是由*調用者*主動等待這個*調用*的結果。異步

而異步則是相反,*調用*在發出以後,這個調用就直接返回了,因此沒有返回結果。換句話說,當一個異步過程調用發出後,調用者不會馬上獲得結果。而是在*調用*發出後,*被調用者*經過狀態、通知來通知調用者,或經過回調函數處理這個調用。async

2.阻塞非阻塞:異步編程

阻塞和非阻塞關注的是程序在等待調用結果(消息,返回值)時的狀態.函數

阻塞調用是指調用結果返回以前,當前線程會被掛起。調用線程只有在獲得結果以後纔會返回。
非阻塞調用指在不能馬上獲得結果以前,該調用不會阻塞當前線程。spa

做者:嚴肅
連接:https://www.zhihu.com/question/19732473/answer/20851256
來源:知乎

線程

3.單線程:code

咱們常說「JavaScript是單線程的」。對象

所謂單線程,是指在JS引擎中負責解釋和執行JavaScript代碼的線程只有一個。不妨叫它主線程。

可是實際上還存在其餘的線程。例如:處理AJAX請求的線程、處理DOM事件的線程、定時器線程、讀寫文件的線程(例如在Node.js中)等等。這些線程可能存在於JS引擎以內,也可能存在於JS引擎以外,在此咱們不作區分。不妨叫它們工做線程。

 

二.JS中的同步異步理解:

1.同步:

Math.sqrt(2);
console.log('Hi');
第一個函數返回時,就拿到了預期的返回值:2的平方根。
第二個函數返回時,就看到了預期的效果:在控制檯打印了一個字符串

2異步:(以異步函數setTimeout爲例)

setTimeout(function(){console.log("a")}, 500);
console.log("b");
//"b"
//"a"
setTimeout函數返回時,並不能當即獲得結果,而是先運行後面的程序,等到被調用函數通知時(500ms之後通知),再運行。

3.異步過程的構成要素:

  主線程發起一個異步請求,相應的工做線程接收請求並告知主線程已收到(異步函數返回);主線程能夠繼續執行後面的代碼,同時工做線程執行異步任務;工做線程完成工做後,通知主線程;主線程收到通知後,執行必定的動做(調用回調函數)。

  因此,從主線程的角度看,一個異步過程包括下面兩個要素:

  • 發起函數(或叫註冊函數)

  • 回調函數callbackFn 

4.消息隊列與事件循環:
工做線程將消息放到消息隊列,主線程經過事件循環過程去取消息。消息就是註冊異步任務時添加的回調函數。

  • 消息隊列:消息隊列是一個先進先出的隊列,它裏面存放着各類消息。

  • 事件循環:事件循環是指主線程重複從消息隊列中取消息、執行的過程。

做者:manxisuo

連接:https://segmentfault.com/a/1190000004322358

 

三.JS中異步編程的幾種方式

1.回調函數:

假設有函數

f1();
f2();
f2必須在f1完成後運行,f1又是一個耗時的應用

 

 則可以使用異步調用:

 
 

function f1(f2){
    setTimeout(function () {
      console.log("a")
      // f1的任務代碼
      f2()}, 1000)}
function f2(){console.log("b")};
f1(f2);
console.log("c");}

//"c"

//"a"

//"b"

這樣,就把同步操做變成了異步操做;

 

2.事件監聽:採用事件驅動模式。任務的執行不取決於代碼的順序,而取決於某個事件是否發生。

 

仍是以f1和f2爲例。首先,爲f1綁定一個事件(這裏採用的jQuery的寫法)。
  f1.on('done', f2);
上面這行代碼的意思是,當f1發生done事件,就執行f2。而後,對f1進行改寫:
  function f1(){
    setTimeout(function () {
      // f1的任務代碼
      f1.trigger('done');
    }, 1000);
  }
f1.trigger('done')表示,執行完成後,當即觸發done事件,從而開始執行f2。

 

3.發佈、訂閱:

4.Promise對象:

Promises對象是CommonJS工做組提出的一種規範,目的是爲異步編程提供統一接口。簡單說,它的思想是,每個異步任務返回一個Promise對象,該對象有一個then方法,容許指定回調函數。好比,f1的回調函數f2,能夠寫成:

相關文章
相關標籤/搜索