對同步和異步、阻塞和非阻塞的理解

1、同步和異步是對調(diào)用雙方之間的關(guān)系來說的

比如 `A 調(diào)用 B `此處A和B可以同處同一線程也可處于不同線程

a、如果A和B處于同一線程,并且A和B都是普通的函數(shù)或方法,那么B相對于A來說就是同步的

b、如果A和B處于同一線程,但是此時(shí)B是一個(gè)協(xié)程或者是帶有回調(diào)的函數(shù)或方法,那么B相對于A來說就是異步的

c、如果A和B處于不同線程,那么毫無疑問B相對于A是異步的

總結(jié)以上幾種解釋,當(dāng)我們說到一個(gè)異步框架或者庫的時(shí)候,要么這個(gè)框架或庫是用的線程機(jī)制,要么用的回調(diào)機(jī)制,要么用的協(xié)程機(jī)制或者發(fā)布訂閱,其實(shí)有的回調(diào)機(jī)制就是基于發(fā)布訂閱的比如nodejs

eg:比如我們說nodejs是一個(gè)異步框架,它底層的實(shí)現(xiàn)是基于uvloop和callback

再比如說gevent是一個(gè)異步i/o庫,它底層的實(shí)現(xiàn)是基于greenlet也就是一種協(xié)程,

tornado也是一個(gè)異步框架,它的實(shí)現(xiàn)是基于ioloop和callback和nodejs類似,

當(dāng)然tornado也有協(xié)程,但是這個(gè)協(xié)程并不是真正的協(xié)程它僅僅簡化了回調(diào)的使用而已。

基于多線程、線程池的異步庫比如boost.......

2、阻塞和非阻塞是被調(diào)用者自身的機(jī)制來說的

比如`A 調(diào)用 B`

a、如果此時(shí)B內(nèi)部存在sleep、while、read/write等耗時(shí)的i/o操作,那么就可以說B是阻塞的,從A的角度來看B沒有立馬返回,

程序卡在對B的調(diào)用了

b、相反如果A調(diào)用B,A并不急于等待B立馬做完,B可以立馬返回,A可以通過其它方式比如輪詢、信號等方式獲取B的結(jié)果,

那么就可以說B是非阻塞的


這樣當(dāng)同步、異步、阻塞、非阻塞搭配在一起的時(shí)候就可以理解了: 同步阻塞-這個(gè)理解起來很簡單比如accept、

同步非阻塞-比如setnoblocking的read/write、異步阻塞-這個(gè)沒啥意義、異步非阻塞-比如select/epoll + callback

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容