IO多路復用到底是不是非同步的?

時間 2021-05-05 18:05:20

1樓:眇望周行

學習tornado、asyncio這些非同步網路庫時,遇到了同樣的問題,網上查到的也都說不明白,原來幾個概念沒搞清楚。

1,I/O操作有多種,處理socket是一種,磁碟讀寫也是一種,暫時分為網路I/O和檔案I/O、

2,I/O多路復用是作業系統級別的,屬於linux作業系統的五種I/O模型中的一種,是作業系統級別同步非阻塞的。

3,非同步網路庫 twisted、tornado、asyncio所謂的非同步,是應用級別的非同步,底層確實是基於epoll實現,基本上都是處理網路I/O,而且都是基於事件驅動的,使用時劃分事件也大多是根據網路請求。

4,作業系統級別的非同步I/O才是真正非同步非阻塞的,然後並沒有很多應用,貌似unix平台沒有,windows NT平台有也很少,而且基本都是檔案I/O。

5,I/O多路復用的實現用的比較多,linux平台的epoll,windows平台的select等,基於epoll,select的應用大多是實現網路I/O。

所以,遇到非同步框架,非同步網路庫都應該知道是應用級別的非同步,而且基本上都是基於epoll/select實現的。

已知tornado會根據系統平台,選擇epoll還是select。

實現高併發有多種方式,python多程序可以利用多核優勢,協程(gevent、asyncio)可以實現應用級別的非同步,celery實現任務非同步,訊息佇列實現服務解耦等等,專案中可以根據實際情況選擇或組合不同的方式。

tornado(web框架/非同步網路庫):程序+非同步+epoll

asyncio:協程+epoll,使用中需要相應的非同步庫,常用aiohttp

以上個人理解,如有出入請指正。

2樓:

reactor模式是同步的,那些說reactor/epoll等等是非同步的人,都混淆了同步/非同步、blocking/nonblocking的概念

3樓:Hugo

非同步和同步是從呼叫方,也就是client芳來看的。多路復用看起來和這個概念沒多大關係,不知想問什麼。多路復用如果是從服務提供方來看,那看起來和阻塞非阻塞有點關係了。

4樓:袁侃

使用多路復用通常意味著你想要通過非同步的方式讀寫資料而不是阻塞在read,write上,但是有的時候也可以利用多路復用來等待乙個超時,所以不能簡單的認為多路復用就是同步非同步,沒有這麼直接的關係

5樓:安曉輝

非同步可以由同步IO模型實現,舉個例子,select這個模型,就是醬紫,在乙個執行緒內,實現了非同步操作。最早的網路程式,多數都是用select實現的非同步操作。

6樓:晃蕩青春的汪

我覺得是看針對哪個執行緒。比如epoll的實現是阻塞在那,那麼直接呼叫epoll的執行緒肯定是同步阻塞。而如果你的event

loop是接請求,丟給下乙個執行緒池去處理事件,那麼這個執行緒是非同步的,也因此能保證你能快速響應請求。世面上一般說的非同步非阻塞網路庫如netty大致就是這個意思

7樓:zr scat

一般情況我們說乙個io操作,等它返回確切的操作狀態,我們稱之為同步,如果不論成功失敗立即返回的,我們稱之為非同步。

epoll屬於多路選擇器,當選擇之後,對io的操作應當立刻返回確切結果(對於寫操作只是寫入快取,讀操作表明快取有資料可讀),相當於先查詢後操作,是用單執行緒模型實現多路io操作的基礎。

你之所以有這個困惑,是因為沒有理清楚,io同步/非同步操作對於選擇使用單執行緒/多執行緒模型的意義,這個是實現層面的東西。

氣質到底是不是天生的?

孤狼 我覺得人完整的性格是天性,家庭環境,模仿電視機裡的人,社會環境,學校環境所形成的。而乙個人的性格一定程度上和氣質有有關係,經歷一段坎坷的經歷身上不自覺就會有一種滄桑的氣質散發出來的。 華夏盛德禮商書院官方號 氣質並不是外在的,而是內在的一中品質通過人一系列的姿態表現出來的,氣質是人的一種內涵,...

到底是不是我的錯?

陌上人如玉 什麼事啊你就說是不是你的錯,說清楚 剛看了你的敘述,我覺得是你的錯,也不是什麼大錯,就是懶,你姐姐比你懂事 首先,你是去吃飯的,而你媽去了還要幫忙 第二,你媽去的比你早,時間比較趕 第三,你是年輕人,你家車剎車不太好,你媽不放心你騎,你就放心你媽騎了嗎 最後,沒有批評你的意思,現在的年輕...

蔡司到底是不是最好的鏡片

區域性地區有猴 蔡司和豪雅都不錯,同價位的話蔡司會稍微差一點。另外,憑我多年網上衝浪的經驗,如果乙個人發感嘆號特別多,那他一定是個容不得別人質疑的鍵盤俠。 是的!蔡司最好!只有賣眼鏡的才會說依視路,豪雅比蔡司好!光學上,蔡司碾壓一切鏡片,現目前,能超越蔡司的只有蔡司自己,其他鏡片與蔡司差距非常大 躲...