關於同步/異步,阻塞/非阻塞的區別

這個問題一直沒太懂。被問到select,poll,epoll究竟是阻塞仍是非阻塞問題
本身的理解:A調用B,可能B操做會當即返回,或者半天才能返回結果。
所謂同步/異步,都是針對被調用者來講。若是被調用者被調用後,直到有結果後才返回,那麼就是同步。若是無論有沒有結果都當即返回,就是異步。
阻塞和非阻塞,A調用B以後,A一直等着B返回結果,這個就是阻塞。若是A調用B以後,就去作其餘事情,這個是非阻塞。javascript

# 好比swoole這種寫法就是異步的,若是有message消息到來,調用函數
$serv->on('Message', function($server, $frame) {
    echo "message: ".$frame->data;
    $server->push($frame->fd, json_encode(["hello", "world"]));
});

下面所有是查看的資料,若是有錯誤,很是歡迎你們可以直接指出。
參考資料:
https://www.zhihu.com/questio...
做者:嚴肅
連接:https://www.zhihu.com/questio...
來源:知乎
著做權歸做者全部。商業轉載請聯繫做者得到受權,非商業轉載請註明出處。java

「阻塞」與"非阻塞"與"同步"與「異步"不能簡單的從字面理解,提供一個從分佈式系統角度的回答。1.同步與異步同步和異步關注的是消息通訊機制 (synchronous communication/ asynchronous communication)所謂同步,就是在發出一個調用時,在沒有獲得結果以前,該調用就不返回。可是一旦調用返回,就獲得返回值了。換句話說,就是由調用者主動等待這個調用的結果。而異步則是相反,調用在發出以後,這個調用就直接返回了,因此沒有返回結果。換句話說,當一個異步過程調用發出後,調用者不會馬上獲得結果。而是在調用發出後,被調用者經過狀態、通知來通知調用者,或經過回調函數處理這個調用。典型的異步編程模型好比Node.js舉個通俗的例子:你打電話問書店老闆有沒有《分佈式系統》這本書,若是是同步通訊機制,書店老闆會說,你稍等,」我查一下",而後開始查啊查,等查好了(多是5秒,也多是一天)告訴你結果(返回結果)。而異步通訊機制,書店老闆直接告訴你我查一下啊,查好了打電話給你,而後直接掛電話了(不返回結果)。而後查好了,他會主動打電話給你。在這裏老闆經過「回電」這種方式來回調。2. 阻塞與非阻塞阻塞和非阻塞關注的是程序在等待調用結果(消息,返回值)時的狀態.阻塞調用是指調用結果返回以前,當前線程會被掛起。調用線程只有在獲得結果以後纔會返回。非阻塞調用指在不能馬上獲得結果以前,該調用不會阻塞當前線程。仍是上面的例子,你打電話問書店老闆有沒有《分佈式系統》這本書,你若是是阻塞式調用,你會一直把本身「掛起」,直到獲得這本書有沒有的結果,若是是非阻塞式調用,你無論老闆有沒有告訴你,你本身先一邊去玩了, 固然你也要偶爾過幾分鐘check一下老闆有沒有返回結果。在這裏阻塞與非阻塞與是否同步異步無關。跟老闆經過什麼方式回答你結果無關。若是是關心blocking IO/ asynchronous IO, 參考 Unix Network Programming View Book編程


老張愛喝茶,廢話不說,煮開水。出場人物:老張,水壺兩把(普通水壺,簡稱水壺;會響的水壺,簡稱響水壺)。1 老張把水壺放到火上,立等水開。(同步阻塞)老張以爲本身有點傻2 老張把水壺放到火上,去客廳看電視,時不時去廚房看看水開沒有。(同步非阻塞)老張仍是以爲本身有點傻,因而變高端了,買了把會響笛的那種水壺。水開以後,能大聲發出嘀~~~~的噪音。3 老張把響水壺放到火上,立等水開。(異步阻塞)老張以爲這樣傻等意義不大4 老張把響水壺放到火上,去客廳看電視,水壺響以前再也不去看它了,響了再去拿壺。(異步非阻塞)老張以爲本身聰明瞭。所謂同步異步,只是對於水壺而言。普通水壺,同步;響水壺,異步。雖然都能幹活,但響水壺能夠在本身完工以後,提示老張水開了。這是普通水壺所不能及的。同步只能讓調用者去輪詢本身(狀況2中),形成老張效率的低下。所謂阻塞非阻塞,僅僅對於老張而言。立等的老張,阻塞;看電視的老張,非阻塞。狀況1和狀況3中老張就是阻塞的,媳婦喊他都不知道。雖然3中響水壺是異步的,可對於立等的老張沒有太大的意義。因此通常異步是配合非阻塞使用的,這樣才能發揮異步的效用。——來源網絡,做者不明。json

做者:愚抄
連接:https://www.zhihu.com/questio...
來源:知乎
著做權歸做者全部。商業轉載請聯繫做者得到受權,非商業轉載請註明出處。swoole


做者:靈劍
連接:https://www.zhihu.com/questio...
來源:知乎
著做權歸做者全部。商業轉載請聯繫做者得到受權,非商業轉載請註明出處。網絡

仍是不一樣層次的問題……一個網絡包從應用程序A發到另外一臺電腦上的應用程序B,須要經歷:從A的業務代碼到A的軟件框架從A的軟件框架到計算機的操做系統內核從A所在計算機的內核到網卡從網卡通過網線發到交換機等設備,層層轉發,到達B所在計算機的網卡從B所在計算機的網卡到B所在計算機的內核從B所在計算機的內核到B的程序的用戶空間從B的軟件框架到B的業務代碼這個層級關係就像是過程調用同樣,前一級調用後一級的功能,後一級返回一個結果給前一級(好比:成功,或者失敗)。只有在單獨一級的調用上,能夠說同步仍是異步的問題。所謂同步,是指調用協議中結果在調用完成時返回,這樣調用的過程當中參與雙方都處於一個狀態同步的過程。而異步,是指調用方發出請求就當即返回,請求甚至可能還沒到達接收方,好比說放到了某個緩衝區中,等待對方取走或者第三方轉交;而結果,則經過接收方主動推送,或調用方輪詢來獲得。從這個定義中,咱們看,首先1和7,這取決於軟件框架的設計,若是軟件框架能夠beginXXX,而後當即返回,這就是一種異步調用,再好比javascript當中的異步HTTP調用,傳入參數時提供一個回調函數,回調函數在完成時調用,再好比協程模型,調用接口後立刻切換到其餘協程繼續執行,在完成時由框架切換回到協程中,這都是典型的異步接口設計。而2和6,其餘答主已經說得很好了,其實都須要調用方本身把數據在內核和用戶空間裏搬來搬去,其實都是同步接口,除非是IOCP這樣的專門的異步傳輸接口,因此這一級實際上是同步的,阻塞與非阻塞的區別實際上是影響調用接口的結果(在特定條件下是否提早返回結果),而不是調用方式。3和5,內核通常經過緩衝區,使用DMI來傳輸數據,因此這一步又是異步的。4,以太網是個同步時序邏輯,隨信號傳輸時鐘,必須兩邊設備同時就緒了才能開始傳輸數據,這又是同步的。總結來講,討論到底是異步仍是同步,必定要嚴格說明說的是哪一部分。其餘答主說非阻塞是同步而不是異步,這毫無疑問是正確的,然而說某個框架是異步IO的框架,這也是正確的,由於說的實際上是框架提供給業務代碼的接口是異步的,不論是回調仍是協程,好比說咱們能夠說某個庫是異步的HTTPClient,並無什麼問題,由於說的是給業務代碼的接口。因爲一般異步的框架都須要在2中使用非阻塞的接口,的確會有不少人把非阻塞和異步混爲一談。框架

相關文章
相關標籤/搜索