首頁  >  文章  >  後端開發  >  如何在 Python Async/Await 中實作「Fire and Forget」非同步操作?

如何在 Python Async/Await 中實作「Fire and Forget」非同步操作?

Barbara Streisand
Barbara Streisand原創
2024-11-09 01:08:02218瀏覽

How to Implement

Python 非同步/等待中的「Fire and Forget」

在某些場景下,需要啟動一個不需要等待其完成的非同步操作。傳統上,Tornado 協程中的「即發即忘」方法可以透過省略 Yield 關鍵字來實現。

然而,在 Python 3.5 的 async/await 語法中,這樣的實作會引發 RuntimeWarning,顯示協程從未等待過。

Asyncio.Task:解決方案

幸運的是,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)
選項2:取消待處理工作工作

透過取消任務,它們將從事件循環的時間表,防止任何潛在的警告。

以上是如何在 Python Async/Await 中實作「Fire and Forget」非同步操作?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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