同步、異步、阻塞與非阻塞

轉載自 https://www.zhihu.com/questio...

在實際應用中,只有三種調用方式:同步-阻塞、同步-非阻塞和異步異步

同步 (synchronous) vs. 異步 (asynchronous)

同步和異步關注的是消息通訊機制async

  • 同步:發出一個調用,在沒有獲得結果以前,該調用不返回。一旦調用返回,就獲得返回值了。
  • 異步:發出一個調用,這個調用就直接返回了,因此沒有返回結果。當被調用者得到結果,會使用其餘方式來通知調用者,或者經過回調函數來處理這個調用。

舉個通俗的例子:分佈式

  • 你打電話問書店老闆有沒有《分佈式系統》這本書。若是是同步通訊機制,書店老闆會說,你稍等,」我查一下",而後開始查啊查,等查好了(多是5秒,也多是一天)告訴你結果(返回結果)。
  • 而異步通訊機制,書店老闆直接告訴你我查一下啊,查好了打電話給你,而後直接掛電話了(不返回結果)。而後查好了,他會主動打電話給你(回調函數)。

阻塞 (blocking) vs. 非阻塞 (non-blocking)

阻塞和非阻塞關注的是程序在等待調用結果時的狀態函數

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

仍是上面的例子:線程

  • 你打電話問書店老闆有沒有《分佈式系統》這本書。若是是阻塞式調用,你會一直等待,直到獲得這本書有沒有的結果。
  • 若是是非阻塞式調用,你無論老闆有沒有告訴你,你本身先一邊去玩了。你可能要偶爾過幾分鐘詢問一下老闆有沒有返回結果(異步-輪詢),或者讓老闆主動打電話來告訴你結果(異步-回調)。
相關文章
相關標籤/搜索