「Fire and Forget」Python Async/Await
在非同步程式設計中,無需等待即可執行非關鍵操作,這非常有用他們的完成。在 Tornado 中,這種「即發即忘」行為可以透過在協程中省略 Yield 關鍵字來實現。然而,在Python 3.5的async/await語法中,這種方法會導致執行時警告並且無法執行所需的操作。
解決方案:asyncio.Task
根據 Python 的 asyncio.Task 文件,它允許「在後台」執行協程。透過使用 asyncio.ensure_future 產生任務,執行不會被阻塞,函數會立即返回,類似於「即發即忘」行為。
import asyncio async def async_foo(): print("async_foo started") await asyncio.sleep(1) print("async_foo done") async def main(): asyncio.ensure_future(async_foo()) # fire and forget async_foo() # Perform other actions if __name__ == '__main__': loop = asyncio.get_event_loop() loop.run_until_complete(main())
輸出:
async_foo started Do some actions 1 async_foo done Do some actions 2 Do some actions 3
處理待處理任務
如果任務在事件循環後仍在執行完成後,可能會顯示警告。為了防止這種情況,事件循環完成後可以等待所有待處理的任務:
# Let's also finish all running tasks: pending = asyncio.Task.all_tasks() loop.run_until_complete(asyncio.gather(*pending))
取消任務
在某些情況下,可能需要取消任務預計不會完成。這可以使用task.cancel()來實現:
# Let's also cancel all running tasks: pending = asyncio.Task.all_tasks() for task in pending: task.cancel() # Now we should await task to execute it's cancellation. # Cancelled task raises asyncio.CancelledError that we can suppress: with suppress(asyncio.CancelledError): loop.run_until_complete(task)
以上是如何在Python 3.5的Async/Await中實作「Fire and Forget」行為?的詳細內容。更多資訊請關注PHP中文網其他相關文章!