Динамически создавайте задачи asyncio, которые будут выполняться вечно - PullRequest
0 голосов
/ 19 июня 2020

Мне нужно создать задачи asyncio (например: l oop .create_task ()) динамически, и эти задачи будут выполняться вечно.

Каков наилучший подход "Fire and забыть "в таком случае? Я знаю, что незавершенные задачи будут собраны в мусор, поэтому я вынужден ждать вечно выполняющихся задач.

Дополнительный контекст:

У меня есть запланированная процедура, которая требует в конечном итоге создать задачи. В результате у меня будет много задач, которые будут выполняться вечно.

Спасибо за вашу помощь.

1 Ответ

0 голосов
/ 19 июня 2020

Как лучше всего подходит в таком случае подход «Выстрелил и забыл»? Я знаю, что не ожидаемые задачи будут собираться мусором,

Это неверно: не ожидаемые задачи, созданные 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())

вот почему я вынужден ждать вечно выполняющиеся задачи.

Безусловно, неплохо по возможности ожидать фоновых задач, чтобы вы собирали их результаты или получали исключения, которые они вызывают, но это ни в коем случае не является обязательным требованием. Некоторые задачи не имеют значимого возвращаемого значения, и можно оставить их запущенными самостоятельно.

...