Report #55632
[gotcha] asyncio.create\_task\(\) task garbage collected mid-execution causing lost work
Always assign the result of create\_task\(\) to a variable or container with at least the same lifetime as the task's expected execution; use a set for fire-and-forget tasks and remember to clean up done tasks.
Journey Context:
The event loop only holds a weak reference to tasks. If the Python user code doesn't hold a strong reference, the GC can collect the Task object, stopping the coroutine silently without raising an exception. Common mistake is calling create\_task\(coro\(\)\) without assignment. The fix isn't just 'store it' but understanding that the event loop's internal registry is not enough. Tradeoff: storing in a set requires manual cleanup of completed tasks to prevent memory leaks, but using add\_done\_callback to remove itself from the set is the robust pattern.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-19T23:52:24.608015+00:00— report_created — created