同步、異步、阻塞、非阻塞
目錄
- 同步、異步、阻塞、非阻塞
- 1、同步
- 2、異步
- 3、同步與異步的區別
- 4、阻塞與非阻塞
- 5、阻塞非阻塞與同步異步的區別?(故事篇)
1、同步
所謂同步,就是發出一個功能呼叫時,在沒有得到結果之前,該呼叫就不回傳或繼續執行后續操作,
簡單來說,同步就是必須一件一件事做,等前一件做完了才能做下一件事,
例如:B/S模式中的表單提交,具體程序是:客戶端提交請求->等待服務器處理->處理完畢回傳,在這個程序中客戶端(瀏覽器)不能做其他事,
2、異步
異步與同步相對,當一個異步程序呼叫發出后,呼叫者在沒有得到結果之前,就可以繼續執行后續操作,當這個呼叫完成后,一般通過狀態、通知和回呼來通知呼叫者,對于異步呼叫,呼叫的回傳并不受呼叫者控制,
對于通知呼叫者的三種方式,具體如下:
- 狀態
即監聽被呼叫者的狀態(輪詢),呼叫者需要每隔一定時間檢查一次,效率會很低,
- 通知
當被呼叫者執行完成后,發出通知告知呼叫者,無需消耗太多性能,
- 回呼
與通知類似,當被呼叫者執行完成后,會呼叫呼叫者提供的回呼函式,
例如:B/S模式中的ajax請求,具體程序是:客戶端發出ajax請求->服務端處理->處理完畢執行客戶端回呼,在客戶端(瀏覽器)發出請求后,仍然可以做其他的事,
3、同步與異步的區別
總結來說,同步和異步的區別:請求發出后,是否需要等待結果,才能繼續執行其他操作,
4、阻塞與非阻塞
阻塞和非阻塞這兩個概念與程式(執行緒)等待訊息通知(無所謂同步或者異步)時的狀態有關,也就是說阻塞與非阻塞主要是程式(執行緒)等待訊息通知時的狀態角度來說的,
阻塞和非阻塞關注的是程式在等待呼叫結果(訊息,回傳值)時的狀態.
阻塞呼叫是指呼叫結果回傳之前,當前執行緒會被掛起,呼叫執行緒只有在得到結果之后才會回傳,
非阻塞呼叫指在不能立刻得到結果之前,該呼叫不會阻塞當前執行緒,
5、阻塞非阻塞與同步異步的區別?(故事篇)
理解同步阻塞、同步非阻塞、異步阻塞、異步阻塞、異步非阻塞
同步/異步關注的是訊息通知的機制,而阻塞/非阻塞關注的是程式(執行緒)等待訊息通知時的狀態,
以小明下載檔案打個比方,從這兩個關注點來再次說明這兩組概念,希望能夠更好的促進大家的理解,
同步阻塞:小明一直盯著下載進度條,到 100% 的時候就完成,
- 同步體現在:等待下載完成通知,
- 阻塞體現在:等待下載完成通知程序中,不能做其他任務處理,
同步非阻塞:小明提交下載任務后就去干別的,每過一段時間就去瞄一眼進度條,看到 100% 就完成,
- 同步體現在:等待下載完成通知,
- 非阻塞體現在:等待下載完成通知程序中,去干別的任務了,只是時不時會瞄一眼進度條,【小明必須要在兩個任務間切換,關注下載進度】
異步阻塞:小明換了個有下載完成通知功能的軟體,下載完成就“叮”一聲,不過小明不做別的事,仍然一直等待“叮”的聲音,
- 異步體現在:下載完成“叮”一聲通知,
- 阻塞體現在:等待下載完成“叮”一聲通知程序中,不能做其他任務處理,
異步非阻塞:仍然是那個會“叮”一聲的下載軟體,小明提交下載任務后就去干別的,聽到“叮”的一聲就知道完成了,
- 異步體現在:下載完成“叮”一聲通知,
- 非阻塞體現在:等待下載完成“叮”一聲通知程序中,去干別的任務了,只需要接收“叮”聲通知即可,【軟體處理下載任務,小明處理其他任務,不需關注進度,只需接收軟體“叮”聲通知,即可】
也就是說,同步/異步是“下載完成訊息”通知的方式(機制),而阻塞/非阻塞則是在等待“下載完成訊息”通知程序中的狀態(能不能干其他任務),在不同的場景下,同步/異步、阻塞/非阻塞的四種組合都有應用,
所以,綜上所述,同步和異步僅僅是關注的訊息如何通知的機制,而阻塞與非阻塞關注的是等待訊息通知時的狀態,也就是說,同步的情況下,是由處理訊息者自己去等待訊息是否被觸發,而異步的情況下是由觸發機制來通知處理訊息者,所以在異步機制中,處理訊息者和觸發機制之間就需要一個連接的橋梁,在小明的例子中,這個橋梁就是軟體“叮”的聲音,
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/46455.html
標籤:設計模式
上一篇:dubbo配置負載均衡、集群環境
下一篇:面向物件的設計原則
