同步、異步和阻塞、非阻塞是一回事嗎?

初次接觸這2組概念時(shí)候,很容易犯糊涂,覺得意思很相近,感覺同步和阻塞差不多,都是一個(gè)做不完,一直等,直到完成再去處理其他事,異步和非阻塞都是無需等待的分別完成一些操作。真的是這樣嗎?

一、概念上理解

1. 同步和異步只要針對(duì)客戶端(C端)

同步,就是在客戶端發(fā)出一個(gè)功能調(diào)用時(shí),在沒有得到結(jié)果之前,該調(diào)用就不返回。也就是必須一件一件事做,等前一件做完了才能做下一件事。

例子:普通B/S模式(同步):提交請(qǐng)求->等待服務(wù)器處理->處理完畢返回 這個(gè)期間客戶端瀏覽器不能干任何事。

異步,當(dāng)c端一個(gè)異步過程調(diào)用發(fā)出后,調(diào)用者不能立刻得到結(jié)果。實(shí)際處理這個(gè)調(diào)用的部件在完成后,通過狀態(tài)、通知和回調(diào)來通知調(diào)用者。

例子:ajax請(qǐng)求(異步): 請(qǐng)求通過事件觸發(fā)->服務(wù)器處理(這是瀏覽器仍然可以作其他事情)->處理完畢

2. 阻塞和非阻塞針對(duì)的是服務(wù)端(S端)

阻塞調(diào)用是指調(diào)用結(jié)果返回之前,當(dāng)前線程會(huì)被掛起(線程進(jìn)入非可執(zhí)行狀態(tài),在這個(gè)狀態(tài)下,cpu不會(huì)給線程分配時(shí)間片,即線程暫停運(yùn)行)。函數(shù)只有在得到結(jié)果之后才會(huì)返回。

例子:比如到你某個(gè)時(shí)候到A樓一層(假如是內(nèi)核緩沖區(qū))取快遞,但是你不知道快遞什么時(shí)候過來,你又不能干別的事,只能死等著。但你可以睡覺(進(jìn)程處于休眠狀態(tài)),因?yàn)槟阒揽爝f把貨送來時(shí)一定會(huì)給你打個(gè)電話(假定一定能叫醒你)。

非阻塞指在不能立刻得到結(jié)果之前,該函數(shù)不會(huì)阻塞當(dāng)前線程,而會(huì)立刻返回。

例子:還是取快遞,如果用忙輪詢的方法,每隔5分鐘到A樓一層(內(nèi)核緩沖區(qū))去看快遞來了沒有。如果沒來,立即返回。而快遞來了,就放在A樓一層,等你去取。

二、老王燒水的例子

網(wǎng)上流傳的一個(gè)經(jīng)典的老王燒水的故事(網(wǎng)友真TM有才):

出場(chǎng)人物:老王,水壺兩把(普通水壺,簡(jiǎn)稱水壺;燒開后會(huì)響的水壺,簡(jiǎn)稱響水壺)。

老王想了想,有好幾種等待方式:

  1. 老王用水壺?zé)⑶艺驹谀抢?,不管水開沒開,每隔一定時(shí)間看看水開了沒。——同步阻塞

老王想了想,這種方法不夠聰明。

  1. 老王還是用水壺?zé)?,不再傻傻的站在那里看水開,跑去臥室上網(wǎng),但是還是會(huì)每隔一段時(shí)間過來看看水開了沒有,水沒有開就走人。——同步非阻塞(輪詢)

老王想了想,現(xiàn)在的方法聰明了些,但是還是不夠好。

  1. 老王這次使用高大上的響水壺來燒水,還是站在那里,但是不會(huì)再每隔一段時(shí)間去看水開,而是等水開了,水壺會(huì)自動(dòng)的通知他。——異步阻塞

老王想了想,既然水壺可以通知我,那我為什么還要傻傻的站在那里等呢,嗯,得換個(gè)方法。

  1. 老王還是使用響水壺?zé)?,跑到臥室上網(wǎng)去,等著響水壺自己把水燒開了以后通知他。——異步非阻塞

老王豁然,這下感覺輕松了很多。

同步和異步

同步就是燒開水,需要自己去輪詢(每隔一段時(shí)間去看看水開了沒),異步就是水開了,然后水壺會(huì)通知你水已經(jīng)開了,你可以回來處理這些開水了。
同步和異步是相對(duì)于操作結(jié)果來說,會(huì)不會(huì)等待結(jié)果返回。

阻塞和非阻塞

阻塞就是說在燒水的過程中,你不可以去干其他的事情,非阻塞就是在同樣的情況下,可以同時(shí)去干其他的事情。阻塞和非阻塞是相對(duì)于線程是否被阻塞。

三、總結(jié)

  1. 同步,就是我客戶端(c端調(diào)用者)調(diào)用一個(gè)功能,該功能沒有結(jié)束前,我(c端調(diào)用者)死等結(jié)果。

  2. 異步,就是我(c端調(diào)用者)調(diào)用一個(gè)功能,不需要知道該功能結(jié)果,該功能有結(jié)果后通知我(c端調(diào)用者)即回調(diào)通知。

  3. 阻塞,就是調(diào)用我(s端被調(diào)用者,函數(shù)),我(s端被調(diào)用者,函數(shù))沒有接收完數(shù)據(jù)或者沒有得到結(jié)果之前,我不會(huì)返回。

  4. 非阻塞,就是調(diào)用我(s端被調(diào)用者,函數(shù)),我(s端被調(diào)用者,函數(shù))立即返回,通過select通知調(diào)用者。

同步/異步主要針對(duì)C端, 但是跟S端不是完全沒有關(guān)系,同步/異步機(jī)制必須S端配合才能實(shí)現(xiàn).同步/異步是由c端自己控制,但是S端是否阻塞/非阻塞, C端完全不需要關(guān)心。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容