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()...)
也是可以的.
おわり.