6 回答

TA貢獻(xiàn)10條經(jīng)驗(yàn) 獲得超3個(gè)贊
異步和同步的區(qū)別在API設(shè)計(jì),異步API在調(diào)用后直接返回,通過回調(diào)或者coroutine獲得結(jié)果。API也是分層的,有框架層的API和系統(tǒng)層的API,多路復(fù)用的IO請求在框架層一定是異步的,因?yàn)榭蚣軐有枰鄯e多個(gè)IO請求一起發(fā)送給系統(tǒng)調(diào)用,那么框架在收到某個(gè)IO請求時(shí)必然無法同步返回結(jié)果,異步設(shè)計(jì)是必然的。框架在調(diào)用系統(tǒng)API的時(shí)候一般多路IO的API是同步的,這并不影響框架層的API是異步這個(gè)事實(shí)。

TA貢獻(xiàn)7條經(jīng)驗(yàn) 獲得超2個(gè)贊
同步異步和多路單路是兩組正交的概念。不存在“多路復(fù)用是否異步”這樣的概念問題,只能在某一個(gè)特定實(shí)現(xiàn)上討論這一點(diǎn)。一般而言只是異步單路和同步多路實(shí)現(xiàn)起來比較困難或者沒什么必要罷了,并不是說這樣的設(shè)計(jì)不存在。
然后,同步異步和多路單路在軟件上都是管理模式的區(qū)別,所以你顯然可以實(shí)現(xiàn)在同步IO上的異步機(jī)制,只要你去進(jìn)行資源管理就行了。具體方法就得具體問題具體討論了。

TA貢獻(xiàn)12條經(jīng)驗(yàn) 獲得超8個(gè)贊
異步用同步IO實(shí)現(xiàn)不就是經(jīng)典的早期程序員們開一個(gè)線程專門用來等一個(gè)鎖的做法嗎(逃,顯然這也是異步的啊,只是有巨大的資源浪費(fèi)而已。異步并不要求你一定要做得比同步好才能叫異步。
IOCP和epoll的區(qū)別主要還是事件代表什么意思的區(qū)別。IOCP的運(yùn)作方式是,你要read一個(gè)東西,你把buffer準(zhǔn)備好,提交上去,IO幫你填好了就告訴你。epoll的運(yùn)作方式,你要read一個(gè)東西,你先提交上去,IO到時(shí)候會告訴你你可以read了,然后你再試一下read。這顯然都可以算成是異步的,因?yàn)槟愀苫畹哪莻€(gè)函數(shù)確實(shí)已經(jīng)返回了,也沒有卡在這個(gè)IO操作上,后面發(fā)生什么事情都是以后的事了。
同步和異步其實(shí)不是一個(gè)機(jī)制的問題,而是你的代碼寫成什么樣子的問題。哪怕系統(tǒng)里只有一個(gè)線程,只要你能假裝成future/promise,你就變異步了
添加回答
舉報(bào)