python非同步io讀檔案 python之非同步IO

2021-10-11 13:22:49 字數 1265 閱讀 6113

我們知道,cpu的速度遠遠快於磁碟、網路等io。在乙個執行緒中,cpu執行**的速度極快,然而,一旦遇到io操作,如讀寫檔案、傳送網路資料時,就需要等待io操作完成,才能繼續進行下一步操作。這種情況稱為同步io。

在io操作的過程中,當前執行緒被掛起,而其他需要cpu執行的**就無法被當前執行緒執行了。

因為乙個io操作就阻塞了當前執行緒,導致其他**無法執行,所以我們必須使用多執行緒或者多程序來併發執行**,為多個使用者服務。每個使用者都會分配乙個執行緒,如果遇到io導致執行緒被掛起,其他使用者的執行緒不受影響。

由於我們要解決的問題是cpu高速執行能力和io裝置的龜速嚴重不匹配,多執行緒和多程序只是解決這一問題的一種方法。

另一種解決io問題的方法是非同步io。當**需要執行乙個耗時的io操作時,它只發出io指令,並不等待io結果,然後就去執行其他**了。一段時間後,當io返回結果時,再通知cpu進行處理。

asyncio可以實現單執行緒併發io操作。如果僅用在客戶端,發揮的威力不大。如果把asyncio用在伺服器端,例如web伺服器,由於http連線就是io操作,因此可以用單執行緒+coroutine實現多使用者的高併發支援。

asyncio實現了tcp、udp、ssl等協議,aiohttp則是基於asyncio實現的http框架。

安裝:pip install aiohttp

示例:'''使用aiohttp搭建web服務'''import asynciofromaiohttp import webasyncdef index(request):await asyncio.sleep(0.5)return web.response(body='

')asyncdef hello(request):await asyncio.sleep(0.5)

text= '

' % request.match_info['name']return web.response(body=text.encode('utf-8'),content_type='text/html')asyncdef init(loop):

print('server started at ')returnsrv

loop=asyncio.get_event_loop()

loop.run_until_complete(init(loop))

loop.run_forever()

這個時候, 就可以通過位址訪問這個web服務

注意aiohttp的初始化函式init()也是乙個coroutine,loop.create_server()則利用asyncio建立tcp服務。

非同步I O之檔案

一 概念 1.1 開啟裝置的操作會向作業系統傳送請求,createfile函式會直接返回,而不會去等待操作完成。1.2 此時作業系統會發現這個請求,然後作業系統會來進行實際的操作,當操作完成之後,1.3 會設定一些標誌,也就是通知。1.4 在作業系統進行實際操作的時候,我可以來做一些想要做的操作,當...

Python學習 非同步IO

在io程式設計一節中,我們已經知道,cpu的速度遠遠快於磁碟 網路等io。在乙個執行緒中,cpu執行 的速度極快,然而,一旦遇到io操作,如讀寫檔案 傳送網路資料時 就需要等待io操作完成,才能繼續進行下一步操作。這種情況稱為同步io 在io操作的過程中,當前執行緒被掛起,而其他需要cpu執行的 就...

python之非同步IO

我們知道,cpu的速度遠遠快於磁碟 網路等io。在乙個執行緒中,cpu執行 的速度極快,然而,一旦遇到io操作,如讀寫檔案 傳送網路資料時,就需要等待io操作完成,才能繼續進行下一步操作。這種情況稱為同步io。在io操作的過程中,當前執行緒被掛起,而其他需要cpu執行的 就無法被當前執行緒執行了。因...