Python 的Async/Await 的「Fire and Forget」
在Python 的async/await 語法中,執行異步函數語法中而不等待它並不'達到預期的“即發即忘”效果。相反,程式會退出並顯示運行時警告。
asyncio.Task for “Fire and Forget”
要在 asyncio 中實作“fire andforget”,請使用 asyncio。任務建立一個在背景執行所需操作的任務。透過呼叫 asyncio.ensure_future(async_foo()),與 async_foo() 關聯的任務將啟動,並且不會等待其完成。對於不需要明確等待的非同步操作,這是一種簡單而有效的方法。
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()
完成待處理任務
請注意,使用 asyncio 建立的任務。任務預計在事件循環結束之前完成。如果任務仍處於待處理狀態,則會產生警告。為了防止這種情況,請在事件循環完成後明確等待所有待處理任務。
async def main(): asyncio.ensure_future(async_foo()) # Fire and forget async_foo() loop = asyncio.get_event_loop() await asyncio.gather(*asyncio.Task.all_tasks())
取消任務而不是等待
或者,如果您不想無限期等待某些任務,您可以取消它們:
async def echo_forever(): while True: print("Echo") await asyncio.sleep(1) async def main(): asyncio.ensure_future(echo_forever()) # Fire and forget echo_forever() loop = asyncio.get_event_loop() for task in asyncio.Task.all_tasks(): task.cancel() with suppress(asyncio.CancelledError): await task
以上是如何利用Python的Async/Await真正實現「Fire and Forget」?的詳細內容。更多資訊請關注PHP中文網其他相關文章!