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