一直對asyncio這個庫比較感興趣,畢竟這是官網也非常推薦的一個實現高并發的一個模塊,python也是在python 3.4中引入了協程的概念。也通過這次整理更加深刻理解這個模塊的使用
asyncio 是干什么的?
異步網絡操作并發協程
python3.0時代,標準庫里的異步網絡模塊:select(非常底層) python3.0時代,第三方異步網絡庫:Tornado python3.4時代,asyncio:支持TCP,子進程
現在的asyncio,有了很多的模塊已經在支持:aiohttp,aiodns,aioredis等等 https://github.com/aio-libs 這里列出了已經支持的內容,并在持續更新
當然到目前為止實現協程的不僅僅只有asyncio,tornado和gevent都實現了類似功能
關于asyncio的一些關鍵字的說明:
event_loop 事件循環:程序開啟一個無限循環,把一些函數注冊到事件循環上,當滿足事件發生的時候,調用相應的協程函數
coroutine 協程:協程對象,指一個使用async關鍵字定義的函數,它的調用不會立即執行函數,而是會返回一個協程對象。協程對象需要注冊到事件循環,由事件循環調用。
task 任務:一個協程對象就是一個原生可以掛起的函數,任務則是對協程進一步封裝,其中包含了任務的各種狀態
future: 代表將來執行或沒有執行的任務的結果。它和task上沒有本質上的區別
async/await 關鍵字:python3.5用于定義協程的關鍵字,async定義一個協程,await用于掛起阻塞的異步調用接口。
看了上面這些關鍵字,你可能扭頭就走了,其實一開始了解和研究asyncio這個模塊有種抵觸,自己也不知道為啥,這也導致很長一段時間,這個模塊自己也基本就沒有關注和使用,但是隨著工作上用python遇到各種性能問題的時候,自己告訴自己還是要好好學習學習這個模塊。
定義一個協程
import timeimport asyncionow = lambda : time.time()async def do_some_work(x): print("waiting:", x)start = now()# 這里是一個協程對象,這個時候do_some_work函數并沒有執行coroutine = do_some_work(2)print(coroutine)# 創建一個事件looploop = asyncio.get_event_loop()# 將協程加入到事件循環looploop.run_until_complete(coroutine)print("Time:",now()-start)在上面帶中我們通過async關鍵字定義一個協程(coroutine),當然協程不能直接運行,需要將協程加入到事件循環loop中
asyncio.get_event_loop:創建一個事件循環,然后使用run_until_complete將協程注冊到事件循環,并啟動事件循環
創建一個task
協程對象不能直接運行,在注冊事件循環的時候,其實是run_until_complete方法將協程包裝成為了一個任務(task)對象. task對象是Future類的子類,保存了協程運行后的狀態,用于未來獲取協程的結果
import asyncioimport timenow = lambda: time.time()async def do_some_work(x): print("waiting:", x)start = now()coroutine = do_some_work(2)loop = asyncio.get_event_loop()task = loop.create_task(coroutine)print(task)loop.run_until_complete(task)print(task)print("Time:",now()-start)
|
新聞熱點
疑難解答