同步與異步,阻塞和非阻塞的概念詳解

原文鏈接:http://baijiahao.baidu.com/s?id=1604983471279587214&wfr=spider&for=pc

從網上看到了一個篇寫的挺不錯的文章,轉載過來方便自己和他人
原文鏈接: 傳送門


重新認識同步與異步,阻塞和非阻塞的概念

前言

在實際的開發中,我們經常會聽到同步,異步,阻塞,非阻塞這些編程概念,每次遇到的時候都會蒙圈,然後就各種查網上似是而非的資料,結果越查越迷糊,大部分文章都千篇一律,沒有說到本質上的區別,所以下次再碰到這些概念,印象還是比較模糊,尤其是在一些場景下同步與阻塞,異步與非阻塞感覺沒啥區別,但其實這四個術語描述的事物還真不是一回事。

下面我們來慢慢探討他們之間的區別與聯繫,在這之前,我們還會經常看到下面的組合術語:

(一)同步+阻塞

(二)同步+非阻塞

(三)異步+阻塞

(四)異步+非阻塞

在當什麼是同步和異步,阻塞與非阻塞的概念還沒弄清楚之前,更別提上面這些組合術語了,只會讓你更加困惑。

關於同步和異步

同步和異步其實指的是,請求發起方對消息結果的獲取是主動發起的,還是等被動通知的。如果是請求方主動發起的,一直在等待應答結果(同步阻塞),或者可以先去處理其他的事情,但要不斷輪詢查看發起的請求是否有應答結果(同步非阻塞 )因爲不管如何都要發起方主動獲取消息結果,所以形式上還是同步操作。如果是由服務方通知的,也就是請求方發出請求後,要麼在一直等待通知(異步阻塞),要麼就先去幹自己的事了(異步非阻塞),當事情處理完成之後,服務方會主動通知請求方,它的請求已經完成,這就是異步。異步通知的方式一般是通過狀態改變,消息通知,或者回調函數來完成,大多數時候採用的都是回調函數。

關於阻塞和非阻塞

阻塞和非阻塞在計算機的世界裏面,通常指的是針對IO的操作,如網絡IO和磁盤IO等。那麼什麼是阻塞和非阻塞呢?簡單的說就是我們調用了一個函數之後,在等待這個函數返回結果之前,當前的線程是處於掛起狀態,還是運行狀態,如果是掛起狀態,就意味着當前線程什麼都不能幹,就等着獲取結果,這就叫同步阻塞,如果仍然是運行狀態,就意味當前線程是可以的繼續處理其他任務,但要時不時的去看下是否有結果了,這就是同步非阻塞。

實際生活場景

同步,異步,阻塞和非阻塞,會組合成上面提到過的四種結果:

(一)同步+阻塞

(二)同步+非阻塞

(三)異步+阻塞

(四)異步+非阻塞

舉個例子,比如我們去照相館拍照,拍完照片之後,商家說需要30分鐘左右才能洗出來照片,

這個時候如果我們一直在店裏面啥都不幹,一直等待商家面前等待它洗完照片,這個過程就叫同步阻塞。

當然大部分人很少這麼幹,更多的是大家拿起手機開始看電視,看一會就會問老闆洗完沒,老闆說沒洗完,然後我們接着看,再過一會接着問,直到照片洗完,這個過程就叫同步非阻塞。

因爲店裏生意太好了,越來越多的人過來拍,店裏面快沒地方坐了,老闆說你把你手機號留下,我一會洗好了就打電話告訴你過來取,然後你去外面找了一個長凳開始躺着睡覺等待老闆打電話,啥不都幹,這個過程就叫異步阻塞。

當然實際情況是,大家可能會直接先去逛街或者吃飯做其他的活動,這樣以來兩不耽誤,這個過程就叫異步非阻塞。

總結

本文主要介紹了同步,異步,阻塞和非阻塞的相關概念和例子,從上面的描述中我們其實能夠看到阻塞和非阻塞通常是指客戶端在發出請求後,在服務端處理這個請求的過程中,客戶端本身是否直接掛起等待結果,還是繼續做其他的任務。而異步和同步,則是對於請求結果的獲取是客戶端主動等待獲取,還是由服務端來通知消息結果。從這一點來看同步和阻塞其實描述的兩個不同角度的事情,阻塞和非阻塞指的一個是客戶端等待消息處理時的本身的狀態,是掛起還是繼續幹別的。同步和異步指的對於消息結果的獲取是客戶端主動獲取,還是由服務端間接推送。記住這兩點關鍵的區別將有助於我們更好的區分和理解它們。


自己的看法:

同步和阻塞搭配,異步和非阻塞搭配感覺更搭.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章