@Dbtzhv

Почему asyncio.current_task() не передается в функцию?

async def info_start_tasks(message: types.Message, next_stage=None, delay=None, task=None):
        ...
        if next_stage!=None:
                task.cancel()

        ...
        end_task = current_task()
        print('CURRENT TASK', end_task)
        await info_start_tasks(message, task=end_task)


Ошибка:
'NoneType' object has no attribute 'cancel'

У функции (там рекурсия) есть сообщения, которые отправляются с asyncio.sleep, поэтому я хочу сделать так, что если функция вызывается с next_stage!=None, то эти отложенные сообщения не скидывались бы
  • Вопрос задан
  • 100 просмотров
Пригласить эксперта
Ответы на вопрос 1
Vindicar
@Vindicar
RTFM!
Цитата из документации:
Return the currently running Task instance, or None if no task is running.

Как я это понимаю, если ты запланировал выполнение функции как задачи через asyncio.create_task(), то эта функция, и все, вызываемые в ней, смогут получить объект задачи, вызвав asyncio.current_task().
Если же управление в текущую функции было передано без использования задач на любом из уровней, только через await вызовы, то current_task() вернёт None.

Но вообще довольно странно. Эксперимент показывает, что хотя бы одна задача должна быть.
Вот код

import asyncio

async def print_task():
    print(asyncio.current_task())


async def foobar():
    await print_task()


async def main():
    print('Direct call')
    await foobar()
    print('create_task')
    task = asyncio.create_task(foobar())
    await task

# asyncio.run(main())  # даст такой же результат
asyncio.get_event_loop().run_until_complete(main())

На питоне 3.11 код выводит два объекта задачи, один создаётся run() или run_until_complete(), а другой - create_task(). Тогда получается, что получить None невозможно.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы