Skip to content

Generator .close does not release resources #118272

Closed

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

Activity

  1. graingert commented on Apr 25, 2024

    @graingert
    Contributor

    bisected to eb4774d using:

    import gc
    import weakref
    
    class Foo:
        pass
    
    f = Foo()
    f_wr = weakref.ref(f)
    
    def genfn():
        a = f
        yield
    
    
    g = genfn()
    next(g)
    del f
    g.close()
    gc.collect()
    print(f_wr)

    outputs:

    <weakref at 0x7fd58a1917b0; to 'Foo' at 0x7fd58ab12cf0>
    

    should output:

    <weakref at 0x7ad6faf19d50; dead>
    

    passes on 3.11, fails on 3.12 and 3.13a6

  2. added
    3.12only security fixes
    3.13only security fixes
    triagedThe issue has been accepted as valid by a triager.
    on Apr 25, 2024
  3. added a commit that references this issue on Apr 25, 2024
  4. iritkatriel commented on Apr 25, 2024

    @iritkatriel
    Member

    Thank you, @gsbrodal for the report, and @graingert for the investigation.

  5. removed
    triagedThe issue has been accepted as valid by a triager.
    on Apr 29, 2024
  6. added 5 commits that reference this issue on Apr 30, 2024
  7. added 2 commits that reference this issue on May 8, 2024
  8. added a commit that references this issue on Jun 13, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    3.12only security fixes3.13only 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