New submission from Serhiy Storchaka <storchaka+cpyt...@gmail.com>:
In the following example: def gen(): try: yield 1 finally: print('finalize inner') def func(): try: for x in gen(): break finally: print('finalize outer') func() print('END') the output in CPython is: finalize inner finalize outer END But in similar example for asynchronous generator: async def gen(): try: yield 1 finally: print('finalize inner') async def func(): try: async for x in gen(): break finally: print('finalize outer') import asyncio asyncio.run(func()) print('END') the output in CPython is: finalize outer finalize inner END There is a strong link somewhere which prevents finalization of the asynchronous generator object until leaving the outer function. Tested on CPython 3.7-3.11. In PyPy "finalize inner" is not printed at all. Using closing() and aclosing() is the right way to get deterministic finalization, but in any case it would be better to get rid of strong link which prevents finalization of the asynchronous generator object. ---------- components: Interpreter Core messages: 396569 nosy: Mark.Shannon, asvetlov, gvanrossum, serhiy.storchaka, yselivanov priority: normal severity: normal status: open title: Finalization of non-exhausted asynchronous generators is deferred type: resource usage versions: Python 3.10, Python 3.11, Python 3.9 _______________________________________ Python tracker <rep...@bugs.python.org> <https://bugs.python.org/issue44518> _______________________________________ _______________________________________________ Python-bugs-list mailing list Unsubscribe: https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com