如何在Python 3.5的Async/Await中实现'Fire and Forget”行为?

DDD
发布: 2024-11-08 21:52:01
原创
454 人浏览过

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中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责声明 Sitemap
PHP中文网:公益在线PHP培训,帮助PHP学习者快速成长!