【发布时间】:2021-11-19 09:55:33
【问题描述】:
我想返回异步生成器的第一个元素并处理剩余的值,而不是像火和忘记一样返回。如何让python中的协程提前返回?
将迭代器传递给asyncio.create_task 后,它不会打印剩余的值。
import asyncio
import time
async def async_iter(num):
for i in range(num):
await asyncio.sleep(0.5)
yield i
async def handle_remains(it):
async for i in it:
print(i)
async def run() -> None:
it = async_iter(10)
async for i in it:
print(i)
break
# await handle_remains(it)
# want to make this `fire and forget`(no await), expecting just printing the remainning values.
asyncio.create_task(handle_remains(it))
return i
if __name__ == '__main__':
asyncio.run(run())
time.sleep(10)
【问题讨论】:
-
你需要有一个运行任务的事件循环:看看documentation。
-
@Jens 这不是
asyncio.run()为你做的吗? -
create_task()函数返回一个 Task 在示例代码中被丢弃——即未分配并按计划进行。 -
@Jens 嗯,来自链接:任务在 get_running_loop() 返回的循环中执行,如果当前线程中没有运行循环,则会引发 RuntimeError。?
-
@Jens 也许我误解了这句话,它只是关于任务在哪个循环中执行,而不是关于执行本身?不过,读起来有点矛盾。
标签: python generator python-asyncio