非同步和非阻塞之間的區別

2022-05-06 03:27:10 字數 1498 閱讀 3206

看了不少關於阻塞、非阻塞、同步和非同步文章,我覺得這篇是講得不錯的。

以下是這篇文章對於阻塞、非阻塞、同步非同步的解釋

阻塞和非阻塞指的是執行乙個操作是等操作結束再返回,還是馬上返回。

比如餐館的服務員為使用者點菜,當有使用者點完菜後,服務員將選單給後台廚師,此時有兩種方式:

第一種就是阻塞方式,第二種則是非阻塞的。

同步和非同步又是另外乙個概念,它是事件本身的乙個屬性。還拿前面點菜為例,服務員直接跟廚師打交道,菜出來沒出來,服務員直接指導,但只有當廚師將菜送到服務員手上,這個過程才算正常完成,這就是同步的事件。同樣是點菜,有些餐館有專門的傳菜人員,當廚師炒好菜後,傳菜員將菜送到傳菜視窗,並通知服務員,這就變成非同步的了。其實非同步還可以分為兩種:帶通知的和不帶通知的。前面說的那種屬於帶通知的。有些傳菜員幹活可能主動性不是很夠,不會主動通知你,你就需要時不時的去關注一下狀態。這種就是不帶通知的非同步。

對於同步的事件,你只能以阻塞的方式去做。而對於非同步的事件,阻塞和非阻塞都是可以的。非阻塞又有兩種方式:主動查詢和被動接收訊息。被動不意味著一定不好,在這裡它恰恰是效率更高的,因為在主動查詢裡絕大部分的查詢是在做無用功。對於帶通知的非同步事件,兩者皆可。而對於不帶通知的,則只能用主動查詢。

但是對於非阻塞和非同步的概念有點混淆,非阻塞只是意味著方法呼叫不阻塞,就是說作為服務員的你不用一直在視窗等,非阻塞的邏輯是"等可以讀(寫)了告訴你",但是完成讀(寫)工作的還是呼叫者(執行緒)服務員的你等菜到視窗了還是要你親自去拿。而非同步意味這你可以不用親自去做讀(寫)這件事,你的工作讓別人(別的執行緒)來做,你只需要發起呼叫,別人把工作做完以後,或許再通知你,它的邏輯是「我做完了 告訴/不告訴 你」,他和非阻塞的區別在於乙個是"已經做完"另乙個是"可以去做"。

這也是nio和aio最大的區別,就是nio在有通知時可以進行相關操作,而aio有通知時則代表操作已經完成

再舉乙個例子:

去書店借一本書,同步就是我要親自到書店,問老闆有沒有這本書,阻塞就是老闆查詢的時候(讀寫)我只能在那等著,老闆找到書後把書交給我,這就是同步阻塞。

我親自到書店借書,老闆在找這本書的時候,我可以去幹別的,然後每隔一段時間去問老闆書找到了沒有,也可以等老闆找到書以後通知我,這就是同步非阻塞。

我想借本書,找個人幫我去借,借到書以後再通知我,這就是非同步,我只發起呼叫,但是本身並不參與這個事件,而是讓別的執行緒去做這個事。

同步與非同步是對應的,它們是執行緒之間的關係,兩個執行緒之間要麼是同步的,要麼是非同步的。

阻塞與非阻塞是對同乙個執行緒來說的,在某個時刻,執行緒要麼處於阻塞,要麼處於非阻塞。

幫我借書的那個人有沒有借到書,我可以打**問他(輪詢),也可以等他通知我,這是非同步的通知;在借書的過程中借書的那個人可以輪詢的方式檢視書是否已經找到(緩衝區有沒有資料),找到了你可以把它拿走,也可以等老闆找到書後通知我,這是非阻塞的通知與輪詢。

同步 非同步 阻塞和非阻塞的區別

在進行網路程式設計時,我們常常見到同步 非同步 阻塞和非阻塞四種呼叫方式。這些方式彼此概念並不好理解。下面是我對這些術語的區別。所謂同步,就是在發出乙個功能呼叫時,在沒有得到結果之前,該呼叫就不返回。按照這個定義,其實絕大多數函式都是同步呼叫 例如sin,isdigit等 但是一般而言,我們在說同步...

同步,非同步,阻塞和非阻塞的區別

一 概念 非同步 某個事情需要10s完成。而我只需要呼叫某個函式告訴 來幫我做 然後我再幹其他的事情 同步 某個事情需要10s完成,我需要一直等它完成 等10s 再能繼續後面的工作。阻塞 做某件事情,直到完成,除非超時 非阻塞 嘗試做,如果不能做,就不做 直接返回 如果能做,就做。前兩者和後兩者不容...

同步 非同步和阻塞 非阻塞的區別

一 阻塞 與 非阻塞 與 同步 與 非同步 不能簡單的從字面理解,提供乙個從分布式系統角度的回答。1.同步與非同步同步和非同步關注的是訊息通訊機制 synchronous communication asynchronous communication 所謂同步,就是在發出乙個 呼叫 時,在沒有得到...