Python 模塊 asyncio-並發執行多個協程

Python 模塊 asyncio-併發執行多個協程

任務 Task 是和事件循環交互的一個主要方式。任務是在協程裡運行的,繼承自 Future,所以其他的協程可以等待任務 Task 完成並獲取返回值。

開啟任務


使用 create_task() 方法創建任務 Task 實例,任務創建後就被事件循環管理,等待執行完後才返回事件循環。

Python 模塊 asyncio-併發執行多個協程

執行:

Python 模塊 asyncio-併發執行多個協程

取消任務


從 create_task() 方法創建任務後,可以調用任務的方法 cancel() 取消任務。

Python 模塊 asyncio-併發執行多個協程

執行:

Python 模塊 asyncio-併發執行多個協程

由於取消了任務,執行到 await 就觸發了異常。

任務傳遞


使用函數 ensure_future() 返回一個任務 Task,它可以傳遞給其他的協程執行,而不需要知道它的來源。

Python 模塊 asyncio-併發執行多個協程

執行:

Python 模塊 asyncio-併發執行多個協程

並行執行多個協程


協程以線性的方式運行時很容易管理,更復雜的情況是允許一個協程同時等待多個協程。

通常把一個操作分成多個部分,然後分別執行他們,例如從不同的資源下載文件或者查詢遠端接口 API。這個時候,執行的順序是不重要的,wait() 方法支持暫停一個協程然後等待多個協程完成操作。

Python 模塊 asyncio-併發執行多個協程

執行:

Python 模塊 asyncio-併發執行多個協程

wait() 返回的是一個元組,分別是已完成的和未完成的任務。本例最後打印了已完成任務的結果,可以看到,返回結果的順序是不定的。

wait() 可以接收一個超時值。

Python 模塊 asyncio-併發執行多個協程

執行:

Python 模塊 asyncio-併發執行多個協程

本例中,wait() 函數使用關鍵字參數 timeout 設置超時值為 0.1,其中有兩個協程超時了,然後取消了這兩個協程。

只獲取數據


如果只是獲取多個後臺協程的返回的數據,調用 gather() 也是很方便的。

Python 模塊 asyncio-併發執行多個協程

執行:

Python 模塊 asyncio-併發執行多個協程

和 wait() 不同的是,gather() 只是返回結果,不返回協程對象,所以也不能取消。返回的結果和傳遞給 gather() 的參數的順序是一致的。

按完成順序返回


方法 as_completed() 和 wait() 一樣,不按順序返回結果。as_completed() 從一個協程列表返回一個生成器,會按順序每次執行一個協程,執行時間短的先返回。

Python 模塊 asyncio-併發執行多個協程

執行:

Python 模塊 asyncio-併發執行多個協程


分享到:


相關文章: