繁体   English   中英

python 异步生成器如何提前返回

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM