在某些場景下,需要啟動一個不需要等待其完成的非同步操作。傳統上,Tornado 協程中的「即發即忘」方法可以透過省略 Yield 關鍵字來實現。
然而,在 Python 3.5 的 async/await 語法中,這樣的實作會引發 RuntimeWarning,顯示協程從未等待過。
幸運的是,Python 的 asyncio 庫透過其 asyncio.Task 類別提供了解決方案。這允許創建一個可以在背景執行的任務,而不會阻塞主執行。
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() # continue with other actions if __name__ == '__main__': loop = asyncio.get_event_loop() loop.run_until_complete(main())
這種方法確保 async_foo() 非同步執行,而其他操作可以繼續執行而無需等待。
需要注意的是,當事件循環完成時,asyncio 期望所有任務都完成。因此,任何剩餘的待處理任務都可能導致警告。為了防止這種情況,可以等待所有待處理任務或取消它們。
選項1:等待待處理任務
pending = asyncio.Task.all_tasks() loop.run_until_complete(asyncio.gather(*pending))
選項2:取消待處理工作工作
pending = asyncio.Task.all_tasks() for task in pending: task.cancel() with suppress(asyncio.CancelledError): loop.run_until_complete(task)
以上是如何在 Python Async/Await 中實作「Fire and Forget」非同步操作?的詳細內容。更多資訊請關注PHP中文網其他相關文章!