如何在不使用 `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)
如果 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)