首页 > 解决方案 > run_until_complete 和 ensure_future 之间的 Python 关系

问题描述

这是此问题的后续问题:

为什么大多数 asyncio 示例都使用 loop.run_until_complete()?

我试图弄清楚异步编程在 python 中是如何工作的。有一些非常基本的东西我仍然不确定..

当有这行代码: 时asyncio.ensure_future(someTask),这行 ALONE 实际上会将Future默认事件循环中返回的内容排入队列并启动任务吗?或者我是否还需要在此之前调用loop.run_until_complete(someTask)(或其他类型的运行)才能启动和运行事件循环?

标签: pythonpython-asyncio

解决方案


asyncio.ensure_future(someTask) 这行 ALONE 是否会真正将默认事件循环中返回的 Future 排入队列并启动任务?

它将调度协程,但不会运行它。您仍然需要运行循环来执行此操作。你可以这样做

loop.run_forever()

如果您希望循环运行直到someTask完成而不是永远运行,请使用

future = asyncio.ensure_future(someTask)
loop.run_until_complete(future)

不要同时打电话asyncio.ensure_future(someTask)loop.run_until_complete(someTask)否则你最终会得到一个RuntimeError因为someTask已经安排好了。


推荐阅读