同步,異步,阻塞,非阻塞

2020-11-07 FastCoder

同步與異步關注的是消息通知的機制,而阻塞與非阻塞關注的是程序(線程)等待消息通知時的狀態。以下載文件打個比方。

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

同步體現在:等待下載完成通知;

阻塞體現在:等待下載完成通知過程中,不能做其他任務處理;

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

同步體現在:等待下載完成通知;

非阻塞體現在:等待下載完成通知過程中,去幹別的任務了,只是時不時會瞄一眼進度條;【必須要在兩個任務間切換,關注下載進度】

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

異步體現在:下載完成「叮」一聲通知;

阻塞體現在:等待下載完成「叮」一聲通知過程中,不能做其他任務處理;

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

異步體現在:下載完成「叮」一聲通知;

非阻塞體現在:等待下載完成「叮」一聲通知過程中,去幹別的任務了,只需要接收「叮」聲通知即可。

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

所以,綜上所述,同步和異步僅僅是關注的消息如何通知的機制,而阻塞與非阻塞關注的是等待消息通知時的狀態。也就是說,同步的情況下,是由處理消息者自己去等待消息是否被觸發,而異步的情況下是由觸發機制來通知處理消息者,所以在異步機制中,處理消息者和觸發機制之間就需要一個連接的橋梁:

在下載的例子中,這個橋梁就是軟體「叮」的聲音。

相關焦點

  • 聊聊同步、異步、阻塞與非阻塞
    經過看了些這幾個概念的資料,發現同步、異步、阻塞、非阻塞的概念其實也並不難以理解,在此寫下此文,歡迎拍磚,希望多多交流。2 阻塞與非阻塞阻塞和非阻塞這兩個概念與程序(線程)等待消息通知(無所謂同步或者異步)時的狀態有關。
  • 概念辨析:同步/異步,阻塞/非阻塞
    同步與異步同步與異步要從服務調用方的視角區分.阻塞與非阻塞阻塞與非阻塞是針對 CPU 而言的.以上面的例子繼續談, 當調用方調用一個同步 API 時, 在等待服務方返回結果期間,如果調用方的 CPU 也陷入等待, 那麼這就是阻塞的;如果調用的 CPU 掛起, 趁機去執行其他的操作, 那麼這就是非阻塞的.
  • 重新認識同步與異步,阻塞和非阻塞的概念
    重新認識同步與異步,阻塞和非阻塞的概念前言在實際的開發中,我們經常會聽到同步,異步,阻塞,非阻塞這些編程概念,每次遇到的時候都會蒙圈,然後就各種查網上似是而非的資料,結果越查越迷糊,大部分文章都千篇一律,沒有說到本質上的區別,所以下次再碰到這些概念,印象還是比較模糊
  • 一篇文章講解同步/異步,阻塞,非阻塞
    同步/異步,阻塞/非阻塞一篇文章徹底弄懂os #作業系統 課程開始之前,我們先看一個假設:小明有一天和他的母親,王叔叔在家,小明母親讓小明去小區門口看著他的父親是否開車回來,如果開車回來,那麼就給他的母親打個電話。
  • 什麼是Node.js的阻塞與非阻塞、同步與異步?
    你可能已經聽說Node.js是「基於Chrome的V8 JavaScript引擎的異步JavaScript運行的」,並且它「使用事件驅動的非阻塞I / O模型,使其輕量級和高效」。但對某些人來說,這不是最好的解釋,或許太過於概念化。首先要了解什麼是Node.js?
  • Python基礎必備知識:同步異步阻塞非阻塞
    在異步消息處理中,等待消息通知者(在這個例子中就是等待辦理業務的人)往往註冊一個回調機制,在所等待的事件被觸發時由觸發機制(在這裡是櫃檯的人)通過某種機制(在這裡是寫在小紙條上的號碼,喊號)找到等待該事件的人。三、阻塞和非阻塞阻塞和非阻塞這兩個概念與程序(線程)等待消息通知(無所謂同步或者異步)時的狀態有關。
  • 「漫畫」「同步異步阻塞非阻塞」
    本文轉載自【微信公眾號:小碼逆襲,ID:gh_7c5a039380a0】經微信公眾號授權轉載,如需轉載與原文作者聯繫我相信很多人看到這四個詞語:阻塞、非阻塞、同步、異步都很容易混淆,傻傻分不清楚,這四個詞又是面試中面試官很喜歡問的,當初我在面試騰訊的時候就被面試官追著問同步和阻塞的區別
  • NIO、BIO、AIO、同步異步、阻塞非阻塞傻傻分不清楚?
    阻塞IO非阻塞IO同步與異步同步與異步是基於應用程式和作業系統處理IO事件所採用的方式:同步:應用程式要直接參與IO讀寫的操作。異步:所有的IO操作交給作業系統去處理,應用程式只需要等待通知。同步IO異步IONIO與BIO的區別總結NIOBIO基於緩衝區( Buffer )基於流( Stream )非阻塞 IO阻塞 IO選擇器( Selector )無BIOBlocking IO,是同步阻塞的IO模型,傳統的IO【java.io包】就是這種模型。
  • IO復用,AIO,BIO,NIO同步,異步,阻塞和非阻塞區別
    二、同步異步,阻塞非阻塞區別聯繫 實際上同步與異步是針對應用程式與內核的交互而言的。同步過程中進程觸發IO操作並等待(也就是我們說的阻塞)或者輪詢的去查看IO操作(也就是我們說的非阻塞)是否完成。 異步過程中進程觸發IO操作以後,直接返回,做自己的事情,IO交給內核來處理,完成後內核通知進程IO完成。
  • Nginx專題之-一文就懂同步和異步阻塞和非阻塞(深入才更懂得)
    、同步與異步的知識。01阻塞與非阻塞阻塞和非阻塞主要是指作業系統或底層的C庫提供的方法或系統的調用,我們調用這些方法可能會導致我的進程sleep的狀態。為什麼會進入sleep狀態,應為當前的條件無法滿足,作業系統會主動把我的進程切換到另外一個進程上繼續等待,這就是一種阻塞的方法。
  • 如何解讀 Java IO、NIO 中的同步阻塞與同步非阻塞?
    但是,對於同步阻塞、同步非阻塞、異步這些概念,還是比較的模糊,一直處於似懂非懂的狀態。所以這兩天,一直在網上看看大家對此的評論,也得到了一些啟發。三、Java 中 IO 和 NIO我們都知道 Java 中:IO 是同步阻塞,而 NIO 是同步非阻塞;而經過上面關於 Liunx 網絡 I/O 模型的解讀,我們都已經比較清楚地了解了同步異步和阻塞非阻塞的概念。
  • Java Sockets I/O: 阻塞、非阻塞與異步(二)
    譯者註:作為一個沒學過作業系統知識而直接學編程的人,對於阻塞、非阻塞、異步的認知,總感覺隔著一層紗。自上次翻譯過 《Event Loop 解疑》 後,它讓我對異步的理解深入了一些,趁熱打鐵,再譯一篇相關的主題。文章比較長,將分為多篇展開。
  • socket阻塞和非阻塞的區別
    ,我們常常見到同步、異步、阻塞和非阻塞四種調用方式。       同步 所謂同步,就是在發出一個功能調用時,在沒有得到結果之前,該調用就不返回。按照這個定義,其實絕大多數函數都是同步調用(例如sin, isdigit等)。但是一般而言,我們在說同步、異步的時候,特指那些需要其他部件協作或者需要一定時間完成的任務。最常見的例子就是 SendMessage。該函數發送一個消息給某個窗口,在對方處理完消息之前,這個函數不返回。
  • Kafka Producer 異步發送消息居然也會阻塞?
    Kafka 一直以來都以高吞吐量的特性而家喻戶曉,就在上周,在一個性能監控項目中,需要使用到 Kafka 傳輸海量消息,在這過程中遇到了一個 Kafka Producer 異步發送消息會被阻塞的問題,導致生產端發送耗時很大。
  • Python進程池(阻塞和異步非阻塞)
    第四個任務等待(進程池已滿)第一個任務結束,第四個任務開始Pool類的實例方法(apply與apply_async):pool.apply_async()apply主進程會被阻塞到函數執行結束apply_async 是異步非阻塞的意思就是:不用等待當前進程執行完畢,隨時根據系統調度來進行進程切換。我們進入看源碼,可以發現我們是要傳入一個函數名,而不是一個函數,參數就用tuple,或者字典。
  • 一代更比一代強,異步非阻塞的藝術,還是python頭髮掉的少
    >老猿猿應該都用過guava的ListenableFuture,現在大家都用CompletableFuture了使用案例地址(並發處理任務,並且匯總結果後統一處理數據):https://download.csdn.net/download/u011643716/12828671JDK1.8中的CompletableFuture為我們提供了異步函數式編程
  • 精講響應式WebClient,GET請求阻塞與非阻塞調優詳解
    精講響應式webclient第1篇-響應式非阻塞IO與基礎用法在上一篇文章為大家介紹了響應式IO模型和WebClient的基本用法。本節來繼續深入的為大家介紹:如何使用WebClient作為Http客戶端發送GET請求與進行響應結果的接收。
  • 從PHP-FPM、NGINX的請求處理來學習阻塞與非阻塞
    php-fpm.confI/O阻塞每個什麼是阻塞非阻塞舉個慄子來說,早上起床了你要去煮麵,面煮上了如果你一直在鍋前等著那你就阻塞了,因為你得看著面不能幹別的事,其他的事得煮完面再去做。你->煮麵->其他的事這是阻塞這次你學聰明了,煮上面然後去刷牙了,面自己煮著就行了,刷完牙回來再看面,還沒好你又去洗臉了,再回來看,面好了,吃飯。你->煮麵->刷牙->煮麵->洗臉->煮麵 同樣的時間多幹了兩個事,這是非阻塞。當然實際的情況跟這個例子差一點。但大體意思是差不多的。
  • 同步與異步Python有何不同?
    術語「同步」和「異步」指的是編寫並發應用程式的兩種方式。所謂的「同步」伺服器使用底層作業系統支持的線程和進程來實現這種並發性。當一個任務需要等待一個外部事件(例如,一個資料庫伺服器的響應)時,不會像一個同步的 worker 那樣等待,而是會告訴循環它需要等待什麼,然後將控制權返回給它。循環就能夠在這個任務被資料庫阻塞的時候發現另外一個準備就緒的任務。最終,資料庫將發送一個響應,而那時循環會認為第一個的任務已經準備好再次運行,並將儘快恢復它。異步任務暫停和恢復執行的這種能力可能在抽象上很難理解。
  • 同步與異步Python有何不同?
    術語「同步」和「異步」指的是編寫並發應用程式的兩種方式。所謂的「同步」伺服器使用底層作業系統支持的線程和進程來實現這種並發性。下面是同步部署的一個示意圖:在這種情況下,我們有 5 臺客戶端,都向應用程式發送請求。