分布式系統(tǒng)關(guān)注點(diǎn)(20)——阻塞與非阻塞有什么區(qū)別?-創(chuàng)新互聯(lián)

如果第二次看到我的文章,歡迎「文末」掃碼訂閱我個(gè)人的公眾號(hào)(跨界架構(gòu)師)喲~?

成都創(chuàng)新互聯(lián)堅(jiān)持“要么做到,要么別承諾”的工作理念,服務(wù)領(lǐng)域包括:網(wǎng)站建設(shè)、成都做網(wǎng)站、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣等服務(wù),滿足客戶于互聯(lián)網(wǎng)時(shí)代的福清網(wǎng)站設(shè)計(jì)、移動(dòng)媒體設(shè)計(jì)的需求,幫助企業(yè)找到有效的互聯(lián)網(wǎng)解決方案。努力成為您成熟可靠的網(wǎng)絡(luò)建設(shè)合作伙伴!

每周五早8點(diǎn) 按時(shí)送達(dá)到公眾號(hào)。當(dāng)然了,也會(huì)時(shí)不時(shí)加個(gè)餐~

前面一篇文章中,Z哥和你聊了「異步」的意義,以及如何運(yùn)用它。錯(cuò)過這篇文章的可以先去看一下再來(lái)(分布式系統(tǒng)關(guān)注點(diǎn)——深入淺出「異步」)。

其實(shí)我知道有不少小伙伴容易將「異步」和「非阻塞」搞混。腦海里印象可能是這樣的:異步=非阻塞,同步=阻塞?

其實(shí)并不是如此,Z哥我這次就想來(lái)幫你搞清楚這個(gè)問題。

同步與阻塞/非阻塞

你平時(shí)編寫的代碼中,大部分的「同步」調(diào)用,本質(zhì)上都是「阻塞」的。但是「同步」調(diào)用也可以做到「非阻塞」的效果。

還是拿我們上一篇中提到的排隊(duì)買奶茶這個(gè)例子,看看為什么說是「同步」+「阻塞」。

文章里「同步」的例子說的是,你排隊(duì)買奶茶,點(diǎn)完單繼續(xù)“占著坑”,不讓后面的人點(diǎn)單,等里面的店員做好奶茶,你拿走了后面的才能點(diǎn)單。這個(gè)其實(shí)就是「同步」+「阻塞」,「阻塞」體現(xiàn)在哪?

分布式系統(tǒng)關(guān)注點(diǎn)(20)——阻塞與非阻塞有什么區(qū)別?

因?yàn)檫@個(gè)時(shí)候你一直“占著坑”,生怕后面的人先點(diǎn)單,導(dǎo)致店員給他先做。所以,這個(gè)時(shí)候你就死死的盯著里面,這個(gè)就是「阻塞」,因?yàn)槟愠硕⒅渌抖几刹涣恕?/p>

怎么讓「同步」也能不阻塞呢?

就是你雖然還是排著隊(duì)“占著坑”,但是人沒閑著,低頭玩玩手機(jī),時(shí)不時(shí)的問里面“我的奶茶做好了沒?我的奶茶做好了沒?”。這個(gè)就是「非阻塞」,因?yàn)槟銉纱卧儐栔g會(huì)間隔一段時(shí)間,可以在這個(gè)時(shí)候做其它的事情。本質(zhì)上是通過將原本的一個(gè)「大同步」拆成多個(gè)「小同步」達(dá)到「非阻塞」的效果。

分布式系統(tǒng)關(guān)注點(diǎn)(20)——阻塞與非阻塞有什么區(qū)別?

上圖中,幾次阻塞之間空白區(qū)域就可以用于做其它事,所以是「非阻塞」的。

異步與阻塞/非阻塞

上一篇文章中的「異步」例子就是一個(gè)「非阻塞」的例子,我們來(lái)看看為什么。

奶茶店分了點(diǎn)單區(qū)和取餐區(qū)之后,做好的飲料就只能從取餐區(qū)拿,也意味著接待你進(jìn)行點(diǎn)單的人并不是實(shí)際做奶茶的人。這個(gè)時(shí)候你會(huì)拿到一張取餐號(hào),然后老老實(shí)實(shí)的去取餐區(qū)等著,而不是“占著xx不xx”。

如果你很著急要拿到奶茶,不斷的問里面“我的奶茶做好了沒?我的奶茶做好了沒?”,那這個(gè)還是「同步」+「非阻塞」的模式。因?yàn)檫@個(gè)過程沒有產(chǎn)生「回調(diào)」,是你在不斷的主動(dòng)發(fā)起“請(qǐng)求”。

但如果你不著急,就在邊上開一局吃雞,等著里面做好了叫號(hào),到你號(hào)碼了再去拿。這就是「異步」+「非阻塞」。因?yàn)檫@個(gè)事情是對(duì)方(里面的店員)觸發(fā)完成的,這就是「回調(diào)」,是對(duì)你之前的“點(diǎn)單”請(qǐng)求進(jìn)行的響應(yīng)。一來(lái)一回完成一個(gè)完整的交互。

分布式系統(tǒng)關(guān)注點(diǎn)(20)——阻塞與非阻塞有什么區(qū)別?

到這可能你會(huì)說,那異步不還是天然「非阻塞」的么?No、No、No。

阻塞不阻塞是你自己決定的,你可以阻塞啊。比如,你等的“回調(diào)”時(shí)候發(fā)現(xiàn)沒帶手機(jī),玩不了吃雞,那只能傻傻的在那等著,啥也干不了。如此,這個(gè)過程雖然還是「異步」的,但對(duì)你來(lái)說就是「阻塞」的。

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

「同步」+「阻塞」。這種最常見,平時(shí)寫的大部分代碼都是如此,就不多說了。

其實(shí)你仔細(xì)想一下就會(huì)發(fā)現(xiàn),很多知名的框架,都是「同步」+「非阻塞」的,為什么呢?因?yàn)槟憧梢岳^續(xù)像「同步」一樣編寫代碼,但是可以享受到類似「異步」所能帶來(lái)的更好的性能,何樂而不為?

比如大名鼎鼎的linux中的io復(fù)用模型poll/select/epoll,本質(zhì)上都是「同步」+「非阻塞」的。還有知名網(wǎng)絡(luò)通信框架Netty。

我們?cè)谠O(shè)計(jì)對(duì)外的api的時(shí)候也可以使用這種模式,降低一些耗時(shí)接口調(diào)用所產(chǎn)生的影響。這個(gè)阮一峰老師已經(jīng)寫的非常清楚了,我就直接貼個(gè)鏈接:http://www.ruanyifeng.com/blog/2018/12/async-api-design.html。

之所以大家會(huì)有錯(cuò)覺,認(rèn)為「異步」=「非阻塞」,其實(shí)也不是沒有道理。為什么呢?因?yàn)槲以谀X海中搜尋來(lái)一番,的確沒想到有什么知名的框架/設(shè)計(jì)是使用「異步」+「阻塞」來(lái)實(shí)現(xiàn)的。如果哪位小伙伴有補(bǔ)充,可以在評(píng)論區(qū)留言告訴大家。

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

總結(jié)

好了,我們一起總結(jié)一下。

這次呢,Z哥先通過同步/異步、阻塞/非阻塞之間形成的4種組合形式,聊了下它們到底是怎么回事。

然后和你聊了一下工作中哪里能看到它們的存在,以及在一些典型場(chǎng)景下適合用哪一種模式。

希望對(duì)你有所啟發(fā)。

最后送你一個(gè)記住這4個(gè)概念的最好辦法。

  • 同步阻塞:你干吧,我看著你干

  • 同步非阻塞:你干吧,我每隔5分鐘來(lái)看看

  • 異步阻塞:你干吧,好了告訴我,我等著

  • 異步非阻塞:你干吧,好了告訴我,我先去忙別的了

如果還是記不住,那就記住同步/異步表示“過程”,阻塞/非阻塞表示在這個(gè)過程中的“狀態(tài)”。至于這句話是怎么來(lái)的,回來(lái)看這篇文章就行。

分布式系統(tǒng)關(guān)注點(diǎn)(20)——阻塞與非阻塞有什么區(qū)別?

相關(guān)文章:

  • 分布式系統(tǒng)關(guān)注點(diǎn)——深入淺出「異步」

  • 分布式系統(tǒng)關(guān)注點(diǎn)——360°全方位解讀「緩存」


作者:Zachary

出處:https://www.cnblogs.com/Zachary-Fan/p/blocknonblock.html

如果你喜歡這篇文章,可以點(diǎn)一下左下角的「推薦」。

這樣可以給我一點(diǎn)反饋。: )

謝謝你的舉手之勞。

?關(guān)于作者:張帆(Zachary,個(gè)人微信號(hào):Zachary-ZF)。堅(jiān)持用心打磨每一篇高質(zhì)量原創(chuàng)。歡迎掃描下方的二維碼~。

定期發(fā)表原創(chuàng)內(nèi)容:架構(gòu)設(shè)計(jì)丨分布式系統(tǒng)丨產(chǎn)品丨運(yùn)營(yíng)丨一些思考。

如果你是初級(jí)程序員,想提升但不知道如何下手。又或者做程序員多年,陷入了一些瓶頸想拓寬一下視野。歡迎關(guān)注我的公眾號(hào)「跨界架構(gòu)師」,回復(fù)「技術(shù)」,送你一份我長(zhǎng)期收集和整理的思維導(dǎo)圖。

如果你是運(yùn)營(yíng),面對(duì)不斷變化的市場(chǎng)束手無(wú)策。又或者想了解主流的運(yùn)營(yíng)策略,以豐富自己的“倉(cāng)庫(kù)”。歡迎關(guān)注我的公眾號(hào)「跨界架構(gòu)師」,回復(fù)「運(yùn)營(yíng)」,送你一份我長(zhǎng)期收集和整理的思維導(dǎo)圖。

分布式系統(tǒng)關(guān)注點(diǎn)(20)——阻塞與非阻塞有什么區(qū)別?

另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無(wú)理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場(chǎng)景需求。

本文名稱:分布式系統(tǒng)關(guān)注點(diǎn)(20)——阻塞與非阻塞有什么區(qū)別?-創(chuàng)新互聯(lián)
分享路徑:http://bm7419.com/article36/ddpcsg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供搜索引擎優(yōu)化網(wǎng)頁(yè)設(shè)計(jì)公司、微信小程序、做網(wǎng)站、ChatGPT、全網(wǎng)營(yíng)銷推廣

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

商城網(wǎng)站建設(shè)