1. 程式人生 > >阻塞和非阻塞、同步和非同步

阻塞和非阻塞、同步和非同步

阻塞和非阻塞

阻塞呼叫是指呼叫結果返回之前,呼叫者會進入阻塞狀態等待。只有在得到結果之後才會返回。

非阻塞呼叫是指在不能立刻得到結果之前,該函式不會阻塞當前執行緒,而會立刻返回。

 

2.同步與非同步
同步和非同步關注的是訊息通訊機制 (synchronous communication/ asynchronous communication)
所謂同步,就是在發出一個*呼叫*時,在沒有得到結果之前,該*呼叫*就不返回。但是一旦呼叫返回,就得到返回值了。
換句話說,就是由*呼叫者*主動等待這個*呼叫*的結果。

而非同步則是相反,*呼叫*在發出之後,這個呼叫就直接返回了,所以沒有返回結果

。換句話說,當一個非同步過程呼叫發出後,呼叫者不會立刻得到結果。而是在*呼叫*發出後,*被呼叫者*通過狀態、通知來通知呼叫者,或通過回撥函式處理這個呼叫。

 

個人認為阻塞與非阻塞和同步與非同步關鍵點是單方還是多方的角度,單方程式中不因為等待某個一塊程式碼塊返回結果才能執行下一步程式碼塊的是阻塞和非阻塞。多方是甲方呼叫乙方,甲方不用等待乙方返回結果,但是乙方處理完過後會給甲方主動返回結果,就像支付寶支付呼叫成功後,支付寶會post支付結果到本伺服器一樣,這就是非同步的。

 

舉例

故事:老王燒開水。

出場人物:老張,水壺兩把(普通水壺,簡稱水壺;會響的水壺,簡稱響水壺)。

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

1.老王用水壺煮水,並且站在那裡不管水開沒開,每隔一定時間看看水開了沒。-同步阻塞

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

2.老王還是用水壺煮水,不再傻傻的站在那裡看水開,跑去寢室上網但是還是會每隔一段時間過來看看水開了沒有,水沒有開就走人。-同步非阻塞

老王想了想,現在的方法聰明瞭些,但是還是不夠好。

3.老王這次使用高大上的響水壺來煮水,站在那裡但是不會再每隔一段時間去看水開,而是等水開了,水壺會自動的通知他。-非同步阻塞

老王想了想,不會呀,既然水壺可以通知我,那我為什麼還要傻傻的站在那裡等呢,嗯,得換個方法。

4.老王還是使用響水壺煮水,跑到客廳上網去

,等著響水壺自己把水煮熟了以後通知他。-非同步非阻塞

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

  • 同步和非同步

    同步就是燒開水,需要自己去輪詢(每隔一段時間去看看水開了沒),非同步就是水開了,然後水壺會通知你水已經開了,你可以回來處理這些開水了。
    非同步就是水壺是否會主動去通知你,然後你再做出反應,是要雙方參與的過程。

  • 阻塞和非阻塞

    對於個人行為的判斷是否要等待 :阻塞就是說在煮水的過程中,你不可以去幹其他的事情,非阻塞就是在同樣的情況下,可以同時去幹其他的事情。阻塞和非阻塞是相對於執行緒是否被阻塞。