如何在不使用 `return` 语句的情况下跳出 asyncio 协程?

How to break out of a asyncio coroutine without using the `return` statement?

如果 except 语句被捕获,我在决定如何中断这个协程时遇到了一些麻烦。通常,我会使用:

def f(x):
    try:
        foo_var = next(a_volitile_generator(x))
    except Exception:
        print('it broked')
        return
    yield foo_var

但是!我将生成大量这些生成器函数,使它们成为协程,最后 Future 化它们并将它们加载到事件循环中。这是问题所在:

loop = asyncio.get_event_loop()
queue = asyncio.Queue(maxsize=100)

async def f(x, result_queue, *, loop=loop):
    while _some_condition() is True:
        try:
            foo_var = await a_volitile_async_generator(x)
        except Exception:
            print('it broked')
            # HELP BELOW
            raise StopAsyncIteration # <--ONLY OPTION????????
        await result_queue.put(foo_var)

将任何东西 返回事件循环 asyncio 中是一个禁忌,因为你会破坏一切......即使那个值是 None.

除此之外,我还想避免加注 StopAsyncIteration...我想弄清楚这是唯一的方法还是我还有其他选择:

仅供参考,我猜你做错了什么。

yield from a_volitile_async_generator(x)

如果 a_volitile_async_generator 是真正的异步生成器,它将无法工作:您 can't use yield from 使用它。

正如@dirn 在评论中的 ,您可以用简单的 break:

替换 raise StopAsyncIteration
async def f(x, result_queue, *, loop=loop):
    while _some_condition() is True:
        try:
            foo_var = await a_volitile_async_generator(x)
        except Exception:
            print('it broked')
            break
        await result_queue.put(foo_var)