Skip to content

Generator .close does not release resources #118272

Closed
@gsbrodal

Description

@gsbrodal

Bug report

Bug description:

Sending a generator .close() in Python 3.12 does not release resources used by local variables as it used to do in earlier versions of Python. Wrapping the generator content in a try: ... except GeneratorExit: pass releases the resources as expected.

The following shows the difference in space usage between wrapping the code with try-except and not.

def generator_using_a_lot_of_space():
    a_big_set = set(range(10_000_000))
    yield 42

g = generator_using_a_lot_of_space()
input('A <press enter>')  # 13.4 MB
print(next(g))
input('B <press enter>')  # 576.6 MB
g.close()
input('C <press enter>')  # 576.6 MB  <== space usage used to drop to 13-14 MB

def generator_using_a_lot_of_space():
    a_big_set = set(range(10_000_000))
    try: 
        yield 42
    except GeneratorExit:
        pass
    
g = generator_using_a_lot_of_space()
input('D <press enter>')  # 14.6 MB
print(next(g))
input('E <press enter>')  # 575.6 MB
g.close()
input('F <press enter>')  # 14.6 MB  <== drop in space usage as expected

The above space measurements were done with
Python 3.12.3 (tags/v3.12.3:f6650f9, Apr 9 2024, 14:05:25) [MSC v.1938 64 bit (AMD64)] on win32
and looking at the space usage reported by the Windows 11 Task Manager.

CPython versions tested on:

3.12

Operating systems tested on:

Windows

Linked PRs

Metadata

Metadata

Assignees

No one assigned

    Labels

    3.12bugs and security fixes3.13bugs and security fixestype-bugAn unexpected behavior, bug, or error

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions