首页 >后端开发 >Python教程 >如何利用Python的Async/Await真正实现'Fire and Forget”?

如何利用Python的Async/Await真正实现'Fire and Forget”?

Patricia Arquette
Patricia Arquette原创
2024-11-09 01:38:02924浏览

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