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