Как лучше всего подходит в таком случае подход «Выстрелил и забыл»? Я знаю, что не ожидаемые задачи будут собираться мусором,
Это неверно: не ожидаемые задачи, созданные asyncio.create_task()
, будут не собираться мусором, пока они запустить. Они принадлежат событию l oop и будут выполняться до завершения (или никогда не завершатся, если они написаны для вечного выполнения) независимо от того, ожидаются ли они явно.
Например, этот код создает две «фоновые» задачи, не ожидая их, и приступает к выполнению чего-то еще.
async def counter(msg, delay):
i = 0
while True:
print(msg, i)
i += 1
await asyncio.sleep(delay)
async def main():
# create two task
asyncio.create_task(counter('slow', 1))
asyncio.create_task(counter('fast', .3))
# ...and wait forever
await asyncio.Event().wait()
asyncio.run(main())
вот почему я вынужден ждать вечно выполняющиеся задачи.
Безусловно, неплохо по возможности ожидать фоновых задач, чтобы вы собирали их результаты или получали исключения, которые они вызывают, но это ни в коем случае не является обязательным требованием. Некоторые задачи не имеют значимого возвращаемого значения, и можно оставить их запущенными самостоятельно.