python3 使用 asyncio 代替執行緒

JhonSmith發表於2019-02-16

python3提供了協程專用的關鍵字async await, 還提供了asyncio庫, 來進行非同步非阻塞的io操作

非同步非阻塞的io操作?

沒有老師檢查我也不知道自己算不算完全懂了, 就不做無用功嘗試說得通俗易懂了.
想要從原理開始理解的話, 推薦tornado的文件

我為何使用asyncio來代替傳統執行緒進行io操作?

  • 由於時間主要耗費在io操作上, 其他操作併發需求不大.
  • 不用規定並行多少, 比較方便穩定.
  • 熟悉tornado工作原理

舉例

並行訪問某網頁十次

import asyncio
import requests
loop = asyncio.get_event_loop()
async def t():                                                    
    get = lambda:requests.get(`http://baidu.com`)
    temp = await loop.run_in_executor(None, get)
    print(temp)   
loop.run_until_complete(asyncio.gather(*[t() for i in range(10)]))

上面這幾行程式碼就可以完成這些操作了.

loop = asyncio.get_event_loop() 協程本身並不具備並行能力, 但是有了這個事件loop就可以進行並行io請求

get = lambda:requests.get(`http://baidu.com`)
temp = await loop.run_in_executor(None, get)

一般函式是無法被await修飾的, 必須用api封裝一下(感覺很像threading), 我之所以再封裝一次get, 是因為run_in_executor傳引數比較坑, 不支援**kwargs

loop.run_until_complete(asyncio.gather(*[t() for i in range(10)]))

run_until_complete這個api是指執行內容物直到結束(api如其名), gather是把任務組合到一起, 如果*的部分有迷惑的話, 你寫asycio.gather(t(),t(), t()...)也是可以的.

おわり.

相關文章