首頁 >後端開發 >Python教學 >如何在Python 3.5的Async/Await中實作「Fire and Forget」行為?

如何在Python 3.5的Async/Await中實作「Fire and Forget」行為?

DDD
DDD原創
2024-11-08 21:52:01504瀏覽

How to Achieve

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

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