Skip to content

[mypyc] Clear coroutine env on coroutine completion#21734

Open
p-sawicki wants to merge 4 commits into
python:masterfrom
p-sawicki:clear-coroutine-env-on-completion
Open

[mypyc] Clear coroutine env on coroutine completion#21734
p-sawicki wants to merge 4 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.

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.

1 participant