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

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

DDD
DDD原创
2024-11-09 04:46:02820浏览

How Can You Implement

Python 异步/等待的“即发即忘”

简介

Python 中的异步编程通常涉及不需要立即关注的任务。处理此类任务的一种方法是使用“即发即忘”模式,该模式允许任务同时运行而不会阻塞主执行流程。

“即发即忘”与异步/等待

在Tornado的协程实现中,可以通过省略yield关键字来实现这种模式。然而,从 Python 3.5 开始,async/await 语法需要不同的方法。

asyncio.Task 到“Fire and Forget”

根据 asyncio.Task 的 Python 文档,协程可以是通过使用 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()

    # ... Other code can be executed here ...

处理待处理任务

默认情况下,asyncio 期望任务在事件循环完成之前完成。如果事件循环完成后任务仍在运行,则会发出警告。为了避免此警告,应在事件循环完成后等待所有待处理的任务。

loop = asyncio.get_event_loop()
loop.run_until_complete(main())

# Wait for any remaining tasks
pending = asyncio.Task.all_tasks()
await asyncio.gather(*pending)

取消任务

在某些情况下,可能需要取消任务而不是等待任务。这可以使用 task.cancel() 来完成,但需要等待被取消的任务才能完成取消。

# ... Same code as before ...

# Cancel all running tasks
pending = asyncio.Task.all_tasks()
for task in pending:
    task.cancel()
    with suppress(asyncio.CancelledError):
        await asyncio.wait_for(task, timeout=None)

以上是如何使用 Python 的 Async/Await 实现'Fire and Forget”?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn