如何在 Python Async/Await 中实现'Fire and Forget”异步操作?

Barbara Streisand
发布: 2024-11-09 01:08:02
原创
279 人浏览过

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)
登录后复制

通过取消任务,它们将从事件循环的时间表中删除,从而防止任何潜在的警告。

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

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板