python之asyncio

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開始引入了新的語法asyncawait,可讓coroutine的代碼更簡潔易讀。

請注意,asyncawait是針對coroutine的新語法,要使用新的語法,只須要作兩步簡單的替換:

  1. @asyncio.coroutine替換爲async
  2. 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())
相關文章
相關標籤/搜索