1. 程式人生 > >關於同步,異步,阻塞,非阻塞的簡單介紹

關於同步,異步,阻塞,非阻塞的簡單介紹

電視 書店 阻塞非阻塞 通信 之前 不能 函數 噪音 被調用

同步、異步、阻塞、非阻塞


同步:所謂同步就是當一個*調用另一個*時,在沒有得到結果之前,該*調用*就不返回東西,一旦有結果,就得到返回值了。
異步:所謂異步同同步相反,當一個*調用一個*時發出時,調用直接得到返回,所以沒有返回結果。換句話說,當一個異步過程調用發出後,調用者不會立刻得到結果。而是在*調用*發出後,*被調用者*通過狀態、通知來通知調用者,或通過回調函數處理這個調用。
舉個通俗的例子:
你打電話問書店老板有沒有《分布式系統》這本書,如果是同步通信機制,書店老板會說,你稍等,”我查一下",然後開始查啊查,等查好了(可能是5秒,也可能是一天)告訴你結果(返回結果)。而異步通信機制,書店老板直接告訴你我查一下啊,查好了打電話給你,然後直接掛電話了(不返回結果)。然後查好了,他會主動打電話給你。在這裏老板通過“回電”這種方式來回調。
參考鏈接:https://www.zhihu.com/question/19732473/answer/20851256

阻塞與非阻塞:
阻塞和非阻塞關註的是程序在等待調用結果(消息,返回值)時的狀態.

阻塞調用是指調用結果返回之前,當前線程會被掛起。調用線程只有在得到結果之後才會返回。
非阻塞調用指在不能立刻得到結果之前,該調用不會阻塞當前線程。
還是上面的例子:
你打電話問書店老板有沒有《分布式系統》這本書,你如果是阻塞式調用,你會一直把自己“掛起”,直到得到這本書的結果。如果是非阻塞式調用,你不管老板有沒有告訴你,你自己先一邊去玩了, 當然你也要偶爾過幾分鐘check一下老板有沒有返回結果。在這裏阻塞與非阻塞與是否同步異步無關。跟老板通過什麽方式回答你結果無關。
作者:嚴肅
鏈接:https://www.zhihu.com/question/19732473/answer/20851256
來源:知乎

下面還有一個簡單的例子:
老張愛喝茶,廢話不說,煮開水。
出場人物:老張,水壺兩把(普通水壺,簡稱水壺;會響的水壺,簡稱響水壺)。
1 老張把水壺放到火上,立等水開。(同步阻塞)老張覺得自己有點傻
2 老張把水壺放到火上,去客廳看電視,時不時去廚房看看水開沒有。(同步非阻塞)老張還是覺得自己有點傻,於是變高端了,買了把會響笛的那種水壺。水開之後,能大聲發出嘀~~~~的噪音。
3 老張把響水壺放到火上,立等水開。(異步阻塞)老張覺得這樣傻等意義不大
4 老張把響水壺放到火上,去客廳看電視,水壺響之前不再去看它了,響了再去拿壺。(異步非阻塞)老張覺得自己聰明了。
所謂同步異步,只是對於水壺而言。普通水壺,同步;響水壺,異步。雖然都能幹活,但響水壺可以在自己完工之後,提示老張水開了。這是普通水壺所不能及的。同步只能讓調用者去輪詢自己(情況2中),造成老張效率的低下。所謂阻塞非阻塞,僅僅對於老張而言。立等的老張,阻塞;看電視的老張,非阻塞。情況1和情況3中老張就是阻塞的,媳婦喊他都不知道。雖然3中響水壺是異步的,可對於立等的老張沒有太大的意義。所以一般異步是配合非阻塞使用的,這樣才能發揮異步的效用。

參考鏈接:https://www.zhihu.com/question/19732473/answer/23434554
來源:知乎

關於同步,異步,阻塞,非阻塞的簡單介紹