分佈式系統關注點(20)——阻塞與非阻塞有什麼區別?

若是第二次看到個人文章,歡迎「文末」掃碼訂閱我我的的公衆號(跨界架構師)喲~
每週五早8點 按時送達到公衆號。固然了,也會時不時加個餐~

前面一篇文章中,Z哥和你聊了「異步」的意義,以及如何運用它。錯過這篇文章的能夠先去看一下再來(分佈式系統關注點——深刻淺出「異步」)。html

其實我知道有很多小夥伴容易將「異步」和「非阻塞」搞混。腦海裏印象多是這樣的:異步=非阻塞,同步=阻塞?linux

其實並非如此,Z哥我此次就想來幫你搞清楚這個問題。程序員


同步與阻塞/非阻塞

你平時編寫的代碼中,大部分的「同步」調用,本質上都是「阻塞」的。可是「同步」調用也能夠作到「非阻塞」的效果。api

仍是拿咱們上一篇中提到的排隊買奶茶這個例子,看看爲何說是「同步」+「阻塞」。緩存

文章裏「同步」的例子說的是,你排隊買奶茶,點完單繼續「佔着坑」,不讓後面的人點單,等裏面的店員作好奶茶,你拿走了後面的才能點單。這個其實就是「同步」+「阻塞」,「阻塞」體如今哪?微信

圖片描述

由於這個時候你一直「佔着坑」,生怕後面的人先點單,致使店員給他先作。因此,這個時候你就死死的盯着裏面,這個就是「阻塞」,由於你除了盯着其它啥都幹不了。網絡


怎麼讓「同步」也能不阻塞呢?架構

就是你雖然仍是排着隊「佔着坑」,可是人沒閒着,低頭玩玩手機,時不時的問裏面「個人奶茶作好了沒?個人奶茶作好了沒?」。這個就是「非阻塞」,由於你兩次詢問之間會間隔一段時間,能夠在這個時候作其它的事情。本質上是經過將本來的一個「大同步」拆成多個「小同步」達到「非阻塞」的效果。框架

圖片描述

上圖中,幾回阻塞之間空白區域就能夠用於作其它事,因此是「非阻塞」的。異步


異步與阻塞/非阻塞

上一篇文章中的「異步」例子就是一個「非阻塞」的例子,咱們來看看爲何。

奶茶店分了點單區和取餐區以後,作好的飲料就只能從取餐區拿,也意味着接待你進行點單的人並非實際作奶茶的人。這個時候你會拿到一張取餐號,而後老老實實的去取餐區等着,而不是「佔着xx不xx」。

若是你很着急要拿到奶茶,不斷的問裏面「個人奶茶作好了沒?個人奶茶作好了沒?」,那這個仍是「同步」+「非阻塞」的模式。由於這個過程沒有產生「回調」,是你在不斷的主動發起「請求」

但若是你不着急,就在邊上開一局吃雞,等着裏面作好了叫號,到你號碼了再去拿。這就是「異步」+「非阻塞」。由於這個事情是對方(裏面的店員)觸發完成的,這就是「回調」,是對你以前的「點單」請求進行的響應。一來一回完成一個完整的交互。

圖片描述

到這可能你會說,那異步不仍是自然「非阻塞」的麼?No、No、No。

阻塞不阻塞是你本身決定的,你能夠阻塞啊。好比,你等的「回調」時候發現沒帶手機,玩不了吃雞,那隻能傻傻的在那等着,啥也幹不了。如此,這個過程雖然仍是「異步」的,但對你來講就是「阻塞」的。


工做中的同步/異步&阻塞/非阻塞

「同步」+「阻塞」。這種最多見,平時寫的大部分代碼都是如此,就很少說了。

其實你仔細想一下就會發現,不少知名的框架,都是「同步」+「非阻塞」的,爲何呢?由於你能夠繼續像「同步」同樣編寫代碼,可是能夠享受到相似「異步」所能帶來的更好的性能,何樂而不爲?

好比大名鼎鼎的linux中的io複用模型poll/select/epoll,本質上都是「同步」+「非阻塞」的。還有知名網絡通訊框架Netty。

咱們在設計對外的api的時候也可使用這種模式,下降一些耗時接口調用所產生的影響。這個阮一峯老師已經寫的很是清楚了,我就直接貼個連接:http://www.ruanyifeng.com/blo...

之因此你們會有錯覺,認爲「異步」=「非阻塞」,其實也不是沒有道理。爲何呢?由於我在腦海中搜尋來一番,的確沒想到有什麼知名的框架/設計是使用「異步」+「阻塞」來實現的。若是哪位小夥伴有補充,能夠在評論區留言告訴你們。

「異步」+「非阻塞」就多了。任何你看到callback關鍵字的框架都是。


總結

好了,咱們一塊兒總結一下。

此次呢,Z哥先經過同步/異步、阻塞/非阻塞之間造成的4種組合形式,聊了下它們究竟是怎麼回事。

而後和你聊了一下工做中哪裏能看到它們的存在,以及在一些典型場景下適合用哪種模式。

但願對你有所啓發。


最後送你一個記住這4個概念的最好辦法。

  • 同步阻塞:你幹吧,我看着你幹
  • 同步非阻塞:你幹吧,我每隔5分鐘來看看
  • 異步阻塞:你幹吧,好了告訴我,我等着
  • 異步非阻塞:你幹吧,好了告訴我,我先去忙別的了

若是仍是記不住,那就記住同步/異步表示「過程」,阻塞/非阻塞表示在這個過程當中的「狀態」。至於這句話是怎麼來的,回來看這篇文章就行。

圖片描述

相關文章:


做者:Zachary

出處:https://www.cnblogs.com/Zacha...


若是你喜歡這篇文章,能夠點一下文末的「」。

這樣能夠給我一點反饋。: )

謝謝你的舉手之勞。


▶關於做者:張帆(Zachary, 我的微信號:Zachary-ZF)。堅持用心打磨每一篇高質量原創。歡迎 掃描下方的二維碼~。
按期發表原創內容: 架構設計丨分佈式系統丨產品丨運營丨一些思考

若是你是初級程序員,想提高但不知道如何下手。又或者作程序員多年,陷入了一些瓶頸想拓寬一下視野。歡迎關注個人公衆號「跨界架構師」,回覆「技術」,送你一份我長期收集和整理的思惟導圖。

若是你是運營,面對不斷變化的市場一籌莫展。又或者想了解主流的運營策略,以豐富本身的「倉庫」。歡迎關注個人公衆號「跨界架構師」,回覆「運營」,送你一份我長期收集和整理的思惟導圖。

圖片描述

相關文章
相關標籤/搜索