首頁 >後端開發 >Python教學 >如何利用Python的Async/Await真正實現「Fire and Forget」?

如何利用Python的Async/Await真正實現「Fire and Forget」?

Patricia Arquette
Patricia Arquette原創
2024-11-09 01:38:02969瀏覽

How to Truly Achieve

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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn