同步、異步、阻塞、非阻塞

同步、異步、阻塞、非阻塞

[TOC]html

一、同步

所謂同步,就是發出一個功能調用時,在沒有獲得結果以前,該調用就不返回或繼續執行後續操做。 簡單來講,同步就是必須一件一件事作,等前一件作完了才能作下一件事。 例如:B/S模式中的表單提交,具體過程是:客戶端提交請求->等待服務器處理->處理完畢返回,在這個過程當中客戶端(瀏覽器)不能作其餘事。ajax

二、異步

異步與同步相對,當一個異步過程調用發出後,調用者在沒有獲得結果以前,就能夠繼續執行後續操做。當這個調用完成後,通常經過狀態、通知和回調來通知調用者。對於異步調用,調用的返回並不受調用者控制。瀏覽器

對於通知調用者的三種方式,具體以下:服務器

  • 狀態

即監聽被調用者的狀態(輪詢),調用者須要每隔必定時間檢查一次,效率會很低。異步

  • 通知

當被調用者執行完成後,發出通知告知調用者,無需消耗太多性能。函數

  • 回調

與通知相似,當被調用者執行完成後,會調用調用者提供的回調函數。性能

例如:B/S模式中的ajax請求,具體過程是:客戶端發出ajax請求->服務端處理->處理完畢執行客戶端回調,在客戶端(瀏覽器)發出請求後,仍然能夠作其餘的事。spa

三、同步與異步的區別

總結來講,同步和異步的區別:請求發出後,是否須要等待結果,才能繼續執行其餘操做。線程

四、阻塞與非阻塞

阻塞和非阻塞這兩個概念與程序(線程)等待消息通知(無所謂同步或者異步)時的狀態有關。也就是說阻塞與非阻塞主要是程序(線程)等待消息通知時的狀態角度來講的。htm

阻塞和非阻塞關注的是程序在等待調用結果(消息,返回值)時的狀態.

阻塞調用是指調用結果返回以前,當前線程會被掛起。調用線程只有在獲得結果以後纔會返回。

非阻塞調用指在不能馬上獲得結果以前,該調用不會阻塞當前線程。

五、阻塞非阻塞與同步異步的區別?(故事篇)

理解同步阻塞、同步非阻塞、異步阻塞、異步阻塞、異步非阻塞

同步/異步關注的是消息通知的機制,而阻塞/非阻塞關注的是程序(線程)等待消息通知時的狀態。

以小明下載文件打個比方,從這兩個關注點來再次說明這兩組概念,但願可以更好的促進你們的理解。

同步阻塞:小明一直盯着下載進度條,到 100% 的時候就完成。

  • 同步體如今:等待下載完成通知。
  • 阻塞體如今:等待下載完成通知過程當中,不能作其餘任務處理。

同步非阻塞:小明提交下載任務後就去幹別的,每過一段時間就去瞄一眼進度條,看到 100% 就完成。

  • 同步體如今:等待下載完成通知。
  • 非阻塞體如今:等待下載完成通知過程當中,去幹別的任務了,只是時不時會瞄一眼進度條。【小明必需要在兩個任務間切換,關注下載進度】

異步阻塞:小明換了個有下載完成通知功能的軟件,下載完成就「叮」一聲。不太小明不作別的事,仍然一直等待「叮」的聲音。

  • 異步體如今:下載完成「叮」一聲通知。
  • 阻塞體如今:等待下載完成「叮」一聲通知過程當中,不能作其餘任務處理。

異步非阻塞:仍然是那個會「叮」一聲的下載軟件,小明提交下載任務後就去幹別的,聽到「叮」的一聲就知道完成了。

  • 異步體如今:下載完成「叮」一聲通知。
  • 非阻塞體如今:等待下載完成「叮」一聲通知過程當中,去幹別的任務了,只須要接收「叮」聲通知便可。【軟件處理下載任務,小明處理其餘任務,不需關注進度,只需接收軟件「叮」聲通知,便可】

也就是說,同步/異步是「下載完成消息」通知的方式(機制),而阻塞/非阻塞則是在等待「下載完成消息」通知過程當中的狀態(能不能幹其餘任務),在不一樣的場景下,同步/異步、阻塞/非阻塞的四種組合都有應用。

因此,綜上所述,同步和異步僅僅是關注的消息如何通知的機制,而阻塞與非阻塞關注的是等待消息通知時的狀態。也就是說,同步的狀況下,是由處理消息者本身去等待消息是否被觸發,而異步的狀況下是由觸發機制來通知處理消息者,因此在異步機制中,處理消息者和觸發機制之間就須要一個鏈接的橋樑。在小明的例子中,這個橋樑就是軟件「叮」的聲音。

原文出處:https://www.cnblogs.com/luyuze95/p/11520945.html

相關文章
相關標籤/搜索