asyncio是Python 3.4版本引入的標準庫,直接內置了對異步IO的支持。python
asnycio是用來編寫併發代碼的庫,python3.5之後使用async/await語法。數據庫
asyncio 被用做多個提供高性能 Python 異步框架的基礎,包括網絡和網站服務,數據庫鏈接庫,分佈式任務隊列等等。api
asyncio 每每是構建 IO 密集型和高層級 結構化 網絡代碼的最佳選擇。網絡
asyncio 提供一組 高層級 API 用於:併發
- 併發地 運行 Python 協程 並對其執行過程實現徹底控制;
- 執行 網絡 IO 和 IPC;
- 控制 子進程;
- 經過 隊列 實現分佈式任務;
- 同步 併發代碼;
此外,還有一些 低層級 API 以支持 庫和框架的開發者 實現:框架
- 建立和管理 事件循環,以提供異步 API 用於
網絡化
, 運行子進程
,處理OS 信號
等等; - 使用 transports 實現高效率協議;
- 經過 async/await 語法 橋接 基於回調的庫和代碼。
利用asyncio實現hello world協程 異步
python3.4async
import asyncio @asyncio.coroutine def hello(): print("Hello!---") # 異步調用asyncio.sleep(1): r = yield from asyncio.sleep(1) print("---World!") # 獲取EventLoop: loop = asyncio.get_event_loop() # 執行coroutine loop.run_until_complete(hello()) loop.close()
@asyncio.coroutine會把一個generator(生成器)標記爲coroutine(協程)類型,而後咱們就把這個coroutine扔到eventloop(事件循環)中去。分佈式
hello()首先會打印出'Hello!----',而後yeild from語法可讓咱們更方便的調用另外一個generator。因爲asyncio.sleep(1)也是一個coroutine,全部線程不會等待asyncio,.sleep(1),而是直接中斷並執行下一個消息循環了。當asyncio返回時,線程就能夠從yield from拿到返回值(此處是None)並執行下一句語句。函數
把asyncio看做是一個耗時1s的I/O操做,在此期間主線程並未等待,而是去執行event_loop中其餘能夠執行的coroutine了,所以能夠實現併發執行。
python 3.5
用asyncio
提供的@asyncio.coroutine
能夠把一個generator標記爲coroutine類型,而後在coroutine內部用yield from
調用另外一個coroutine實現異步操做。
爲了簡化並更好地標識異步IO,從Python 3.5開始引入了新的語法async
和await
,可讓coroutine的代碼更簡潔易讀。
請注意,async
和await
是針對coroutine的新語法,要使用新的語法,只須要作兩步簡單的替換:
- 把
@asyncio.coroutine
替換爲async
; - 把
yield from
替換爲await
。
那麼上述代碼能夠簡化爲:
import asyncio async def hello(): print("Hello!---") # 異步調用asyncio.sleep(1): await asyncio.sleep(1) print("---World!") # 獲取EventLoop: loop = asyncio.get_event_loop() # 執行coroutine loop.run_until_complete(hello()) loop.close()
python 3.7
新增了asyncio.run() api來執行異步函數
上述代碼能夠改成:
import asyncio async def hello(): print("Hello!---") # 異步調用asyncio.sleep(1): await asyncio.sleep(1) print("---World!") asyncio.run(hello())