同步與阻塞,異步與非阻塞的區別

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

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

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

(一)同步+阻塞異步

(二)同步+非阻塞ide

(三)異步+阻塞函數

(四)異步+非阻塞spa

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

關於同步和異步開發

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

關於阻塞和非阻塞回調函數

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

實際生活場景

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

(一)同步+阻塞

(二)同步+非阻塞

(三)異步+阻塞

(四)異步+非阻塞

舉個例子,好比咱們去照相館拍照,拍完照片以後,商家說須要30分鐘左右才能洗出來照片,

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

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

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

固然實際狀況是,你們可能會直接先去逛街或者吃飯作其餘的活動,這樣以來兩不耽誤,這個過程就叫異步非阻塞。

總結

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

相關文章
相關標籤/搜索