asyncio.create_task() documentation says
asyncio.create_task(coro, *, name=None, context=None)
...
Important: Save a reference to the result of this function, to avoid a task
disappearing mid-execution. The event loop only keeps weak references to
tasks. A task that isn’t referenced elsewhere may get garbage collected at
any time, even before it’s done. For reliable “fire-and-forget” background
tasks, gather them in a collection: