Skip to content

[mypyc] Clear coroutine env on coroutine completion#21734

Merged
p-sawicki merged 6 commits into
python:masterfrom
p-sawicki:clear-coroutine-env-on-completion
Jul 17, 2026
Merged

[mypyc] Clear coroutine env on coroutine completion#21734
p-sawicki merged 6 commits into
python:masterfrom
p-sawicki:clear-coroutine-env-on-completion

Conversation

@p-sawicki

@p-sawicki p-sawicki commented Jul 15, 2026

Copy link
Copy Markdown
Collaborator

The env_class object associated with a mypyc coroutine is not immediately cleared when the coroutine completes. This can significantly increase memory usage, since the env class may hold references to captured locals and values spilled across suspension points.

The objects are eventually collectible by the GC but the collection might be delayed in cases where a nested coroutine is awaited, eg.

async def allocate(size: int) -> None:
    payload = bytearray(size)

    async def nested() -> int:
        return payload[-1]

    assert await nested() == 0

With nesting mypyc creates env classes for both allocate and nested that may reference each other and form a cycle.

To fix this, clear the env_class immediately after the coroutine completes. This matches behavior of cpython, which clears frames of completed coroutines immediately in the eval loop.

@p-sawicki
p-sawicki merged commit 2601fb7 into python:master Jul 17, 2026
18 checks passed
@p-sawicki
p-sawicki deleted the clear-coroutine-env-on-completion branch July 17, 2026 16:17
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants