[英]python how to make early return when asyncio generator
我想返回异步生成器的第一个元素并处理剩余的值,而不像火并忘记那样返回。 如何让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)
您已经接近代码,但还没有完全实现(另请参阅我上面的评论)。 简而言之,创建任务是不够的:任务需要运行:
task = asyncio.create_task(handle_remains(it)) # Creates a Task in `pending` state.
await task # Run the task, i.e. execute the wrapped coroutine.
Task 连同协程和 Futures 是一个“ 可等待的”。 实际上:
当协程被包装到具有 asyncio.create_task() 等函数的任务中时,协程会自动安排很快运行。
请注意“计划很快运行”,现在您必须确保通过调用await来实际运行任务,这是一个关键字……
用于获取协程执行的结果。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.