▶關於作者:張帆(Zachary,個人微訊號:Zachary-ZF)。堅持用心打磨每一篇高質量原創。 歡迎 訂閱我的 原創 微信公眾號(跨界架構師) 喲~ 和我一起嘮嘮嗑~
定期發表原創內容:架構設計丨分散式系統丨產品丨運營丨一些思考。
分散式系統關注點(20)——阻塞與非阻塞有什麼區別?
如果第二次看到我的文章,歡迎「左側導航欄」或「文末」掃碼訂閱我個人的公眾號(跨界架構師)喲~
每週五早8點 按時送達到公眾號。當然了,也會時不時加個餐~
前面一篇文章中,Z哥和你聊了「非同步」的意義,以及如何運用它。錯過這篇文章的可以先去看一下再來(
分散式系統關注點——深入淺出「非同步」
)。
其實我知道有不少小夥伴容易將「非同步」和「非阻塞」搞混。腦海裡印象可能是這樣的:非同步=非阻塞,同步=阻塞?
其實並不是如此,Z哥我這次就想來幫你搞清楚這個問題。
同步與阻塞/非阻塞
你平時編寫的程式碼中,大部分的「同步」呼叫,本質上都是「阻塞」的。但是「同步」呼叫也可以做到「非阻塞」的效果。
還是拿我們上一篇中提到的排隊買奶茶這個例子,看看為什麼說是「同步」+「阻塞」。
文章裡「同步」的例子說的是,你排隊買奶茶,點完單繼續“佔著坑”,不讓後面的人點單,等裡面的店員做好奶茶,你拿走了後面的才能點單。這個其實就是「同步」+「阻塞」,「阻塞」體現在哪?
因為這個時候你一直“佔著坑”,生怕後面的人先點單,導致店員給他先做。所以,這個時候你就死死的盯著裡面,這個就是「阻塞」,因為你除了盯著其它啥都幹不了。
怎麼讓「同步」也能不阻塞呢?
就是你雖然還是排著隊“佔著坑”,但是人沒閒著,低頭玩玩手機,時不時的問裡面“我的奶茶做好了沒?我的奶茶做好了沒?”。這個就是「非阻塞」,因為你兩次詢問之間會間隔一段時間,可以在這個時候做其它的事情。本質上是透過將原本的一個「大同步」拆成多個「小同步」達到「非阻塞」的效果。
上圖中,幾次阻塞之間空白區域就可以用於做其它事,所以是「非阻塞」的。
非同步與阻塞/非阻塞
上一篇文章中的「非同步」例子就是一個「非阻塞」的例子,我們來看看為什麼。
奶茶店分了點單區和取餐區之後,做好的飲料就只能從取餐區拿,也意味著接待你進行點單的人並不是實際做奶茶的人。這個時候你會拿到一張取餐號,然後老老實實的去取餐區等著,而不是“佔著xx不xx”。
如果你很著急要拿到奶茶,不斷的問裡面“我的奶茶做好了沒?我的奶茶做好了沒?”,那這個還是「同步」+「非阻塞」的模式。
因為這個過程沒有產生「回撥」,是你在不斷的主動發起“請求”
。
但如果你不著急,就在邊上開一局吃雞,等著裡面做好了叫號,到你號碼了再去拿。這就是「非同步」+「非阻塞」。
因為這個事情是對方(裡面的店員)觸發完成的,這就是「回撥」,是對你之前的“點單”請求進行的響應
。一來一回完成一個完整的互動。
到這可能你會說,那非同步不還是天然「非阻塞」的麼?No、No、No。
阻塞不阻塞是你自己決定的,你可以阻塞啊。比如,你等的“回撥”時候發現沒帶手機,玩不了吃雞,那隻能傻傻的在那等著,啥也幹不了。如此,這個過程雖然還是「非同步」的,但對你來說就是「阻塞」的。
工作中的同步/非同步&阻塞/非阻塞
「同步」+「阻塞」。這種最常見,平時寫的大部分程式碼都是如此,就不多說了。
其實你仔細想一下就會發現,很多知名的框架,都是「同步」+「非阻塞」的,為什麼呢?因為你可以繼續像「同步」一樣編寫程式碼,但是可以享受到類似「非同步」所能帶來的更好的效能,何樂而不為?
比如大名鼎鼎的linux中的io複用模型poll/select/epoll,本質上都是「同步」+「非阻塞」的。還有知名網路通訊框架Netty。
我們在設計對外的api的時候也可以使用這種模式,降低一些耗時介面呼叫所產生的影響。這個阮一峰老師已經寫的非常清楚了,我就直接貼個連結:http://www.ruanyifeng.com/blog/2018/12/async-api-design.html。
之所以大家會有錯覺,認為「非同步」=「非阻塞」,其實也不是沒有道理。為什麼呢?因為我在腦海中搜尋來一番,的確沒想到有什麼知名的框架/設計是使用「非同步」+「阻塞」來實現的。如果哪位小夥伴有補充,可以在評論區留言告訴大家。
「非同步」+「非阻塞」就多了。任何你看到callback關鍵字的框架都是。
總結
好了,我們一起總結一下。
這次呢,Z哥先透過同步/非同步、阻塞/非阻塞之間形成的4種組合形式,聊了下它們到底是怎麼回事。
然後和你聊了一下工作中哪裡能看到它們的存在,以及在一些典型場景下適合用哪一種模式。
希望對你有所啟發。
最後送你一個記住這4個概念的最好辦法。
-
同步阻塞:你幹吧,我看著你幹
-
同步非阻塞:你幹吧,我每隔5分鐘來看看
-
非同步阻塞:你幹吧,好了告訴我,我等著
-
非同步非阻塞:你幹吧,好了告訴我,我先去忙別的了
如果還是記不住,那就記住
同步/非同步表示“過程”,阻塞/非阻塞表示在這個過程中的“狀態”
。至於這句話是怎麼來的,回來看這篇文章就行。
相關文章:
作者:
Zachary
出處: https://www.cnblogs.com/Zachary-Fan/p/blocknonblock.html
如果你喜歡這篇文章,可以點一下左下角的「 大拇指 」。
這樣可以給我一點反饋。: )
謝謝你的舉手之勞。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31544142/viewspace-2644682/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 阻塞式程式設計和非阻塞式程式設計區別程式設計
- 同步、非同步、阻塞、非阻塞的區別非同步
- 怎樣理解阻塞非阻塞與同步非同步的區別?非同步
- IO - 同步 非同步 阻塞 非阻塞的區別非同步
- 阻塞IO與非阻塞IO
- [作業系統]阻塞io 非阻塞io Epoll作業系統
- 同步、非同步、阻塞與非阻塞非同步
- 同步非同步 與 阻塞非阻塞非同步
- (12)非阻塞賦值與阻塞賦值區別(以簡單例子說明)賦值單例
- FastAPI之阻塞式io和非阻塞式ioASTAPI
- 大白話搞懂什麼是同步/非同步/阻塞/非阻塞非同步
- 【linux】驅動-13-阻塞與非阻塞Linux
- [譯] 非同步程式設計:阻塞與非阻塞非同步程式設計
- 徹底搞懂同步非同步與阻塞非阻塞非同步
- 同步非同步,阻塞非阻塞非同步
- 非同步、同步、阻塞、非阻塞非同步
- socket阻塞與非阻塞,同步與非同步、I/O模型非同步模型
- 分散式系統關注點(18)——「快取穿透」和「快取雪崩」到底啥區別?分散式快取穿透
- 同步、非同步,阻塞、非阻塞理解非同步
- 驅動Driver-阻塞&非阻塞
- 理解阻塞、非阻塞、同步、非同步非同步
- 分散式系統關注點——初識「高可用」分散式
- 聊聊執行緒與程式 & 阻塞與非阻塞 & 同步與非同步執行緒非同步
- 對於同步、非同步、阻塞、非阻塞的幾點淺薄理解非同步
- 如何給女朋友解釋什麼是IO中的阻塞、非阻塞、同步、非同步?非同步
- 【OS】同步非同步/阻塞非阻塞、併發並行序列的區分非同步並行
- 如何解讀 Java IO、NIO 中的同步阻塞與同步非阻塞?Java
- 玩轉 PHP 網路程式設計全套阻塞與非阻塞 IOPHP程式設計
- 分散式系統關注點(19)——深入淺出「非同步」分散式非同步
- 程式與執行緒、同步與非同步、阻塞與非阻塞、併發與並行執行緒非同步並行
- 《大前端進階 Node.js》系列 非同步非阻塞(阻塞究竟是指什麼?)前端Node.js非同步
- 分散式系統關注點——想通關「限流」?只要這一篇分散式
- Linux 阻塞和非阻塞 IO 實驗學習Linux
- 精講響應式WebClient第2篇-GET請求阻塞與非阻塞呼叫方法詳解Webclient
- 分散式系統關注點——如何去實施「負載均衡」?分散式負載
- 分散式系統關注點——360°全方位解讀「快取」分散式快取
- 分散式系統關注點——先寫DB還是「快取」?分散式快取
- 分散式系統關注點——「高內聚低耦合」詳解分散式