小编Nat*_*itō的帖子

当没有对它的引用时,它的 finally 块中没有“await”的异步生成器会立即关闭吗?

根据这个博客,正常的生成器在没有引用时会立即关闭。(不过是 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)

asynchronous cpython python-3.x

8
推荐指数
0
解决办法
174
查看次数

标签 统计

asynchronous ×1

cpython ×1

python-3.x ×1