python3 使用 asyncio 代替線程

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

異步非阻塞的io操做?

沒有老師檢查我也不知道本身算不算徹底懂了, 就不作無用功嘗試說得通俗易懂了.
想要從原理開始理解的話, 推薦tornado的文檔html

我爲什麼使用asyncio來代替傳統線程進行io操做?

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

舉例

並行訪問某網頁十次python

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)]))

上面這幾行代碼就能夠完成這些操做了.api

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)])) async

run_until_complete這個api是指運行內容物直到結束(api如其名), gather是把任務組合到一塊兒, 若是*的部分有迷惑的話, 你寫asycio.gather(t(),t(), t()...)也是能夠的.ide

おわり.函數

相關文章
相關標籤/搜索