1、先來簡單的理解前端
同步與異步是針對"請求"的,從宏觀上把握執行結果
同步:調用者發起一次請求,沒有獲得結果以前,就一直等着。即:調用者一直等待結果返回,沒有結果,就一直等,什麼事也不幹。
異步:調用者發起一次請求,被調用者立刻返回請求成功,可是請求成功不表明結果處理完成。即:A調用B,B告訴A我拿到你的請求了(返回成功),等我處理完成了(處理結果),我通知你。這時候A就能夠去幹其餘的事情了,不必一直等着。web
阻塞與非阻塞是針對"線程"的,從微觀上把握執行過程
阻塞:在處理一次請求時,會有不少流程,假設有流程A、流程B、流程C三個,順序執行,流程C執行完了就返回結果。如今當前線程走到流程B時,由於某種緣由卡主了或者說須要執行好久,則當前線程掛起了,即稱之爲阻塞住了。
非阻塞:在處理一次請求時,會有不少流程,假設有流程A、流程B、流程C三個,當前線程執行A時,順利結束,執行B時,會很花時間,則他去執行C,執行C完成了就返回結果,即當前線程不會由於某個點(執行B花很長時間)而等起。
2、列舉詳細的例子描述
場景:老李去修理鋪修電瓶車
出場人物:老李、電瓶車、老闆
1.同步阻塞:老李帶上電瓶車去商鋪找老闆,說須要修理電瓶車,而後老李在商鋪一直等着,等待老闆將電瓶車修好,老李再騎上電瓶車回家。
點評:老李在等待期間,什麼事都不能幹,就一直等着。
2.同步非阻塞:老李帶上電瓶車去商鋪找老闆,說須要修理電瓶車,老闆回覆說好,而後老李就回家(或者幹其餘事情去了)。而後老李時不時的返回到修理鋪看下他的車子修好沒有,這期間固然老李會來屢次。----這在程序上體現爲:輪詢。
點評:老李在老闆修車期間,能夠幹其餘事情,只是老李時不時的去修理鋪看下車子修好沒有比較浪費時間。
3.異步阻塞:老李帶上電瓶車去商鋪找老闆,說須要修理電瓶車,老闆回覆說"ok,車子修好了,我通知你過來取",可是老子一根筋,我就在這裏等,就要等你修好了,我取車。
點評:真實的業務場景是不會有這種狀況的。即真實的程序中不會這麼使用
4.異步非阻塞:老李帶上電瓶車去商鋪找老闆,說須要修理電瓶車,老闆回覆說"ok,車子修好了,我通知你過來取"。老李回覆"嗯,要得",而後老李去幹其餘的事情了。老李既不須要在現場等,也不須要時不時的過來查看修車結果,老李徹底被釋放出來了,能夠幹其餘的事情。
點評:異步通常配合非阻塞使用,才能發揮異步做用。很明顯異步與阻塞一塊兒使用時沒有任何意義與價值。後端
實際的業務場景確定是使用 同步阻塞 與 異步非阻塞。
同步阻塞:前端調用後端接口,須要根據接口返回的數據進行頁面渲染,即後端沒有返回數據,則前端沒法渲染,因此,前端須要一直等後端結果。
異步非阻塞:兩個後端進行交互,後端A請求後端B的接口,這個接口B要處理不少事情,B處理完了回調A,通知A處理結果。舉例:A將視頻放在存儲webtv/alibaba/video/tengxun.mp4位置上,而後請求B,告訴B視頻在存儲上位置,B立馬返回A:ok,A拿到ok後,就幹其餘的事情了。此時B開始對視頻進行轉碼、抽幀等一系列事情,處理完後,結果可能成功與失敗,都會通知A處理結果。異步