根据这个博客,正常的生成器在没有引用时会立即关闭。(不过是 CPython 独有的)。我的问题是“这是否适用于在 finally 块中没有‘await’的异步生成器?”
我是一个异步库的作者,并希望异步生成器像普通的一样工作。否则,用户必须编写这样的代码
agen = async_generator_function()
async with async_closing(agen):
async for v in agen:
if some_condition:
break
do_something()
Run Code Online (Sandbox Code Playgroud)
而不是这个
async for v in async_generator_function():
if some_condition:
break
do_something()
Run Code Online (Sandbox Code Playgroud)
这很烦人。幸运的是,它的单元测试总是按我的预期工作,所以我想知道它是否有保证。
以下代码
import asyncio
async def agen_func():
try:
for i in range(10):
yield i
finally:
print('finalized')
async def main():
async for i in agen_func():
print(i)
if i > 2:
break
print('end of main()')
asyncio.run(main())
Run Code Online (Sandbox Code Playgroud)
打印
0
1
2
3
end of main()
finalized …Run Code Online (Sandbox Code Playgroud)