Python asyncio: продолжение выполнения поле timeout

Рейтинг: 0Ответов: 0Опубликовано: 18.03.2023

У меня есть handler и я хочу ждать только, например, 5 секунд, а затем выполнять код дальше. Но проблема в том, что когда заканчивается время и я получаю asyncio.TimeoutError, то код, который выполнялся в handler останавливается. Есть ли способ не завершать выполнение handler, а просто, не дожидаясь конца его выполнения, пойти дальше через определённое время?

import asyncio


async def handler():
    print("started")
    await asyncio.sleep(5)
    # Должен закончиться не зависимо от того, прошёл timeout или нет
    print("done")


async def main():
    try:
        result = await asyncio.wait_for(handler(), timeout=3)
    except asyncio.TimeoutError:
        # Не успел выполнить handler, по этому ставим default значение
        result = "Time out!"

    print(result)
    await asyncio.sleep(10)  # Заглушка, т.е тут не конец программы и у handler есть время для выполнения


if __name__ == '__main__':
    asyncio.run(main())

Есть такой вариант, но, как по мне, выглядит как костыль

import asyncio
import time


async def handler():
    print("started")
    await asyncio.sleep(5)
    # Должен закончиться не зависимо от того, прошёл timeout или нет
    print("done")


async def main():

    start = time.time()
    task = asyncio.create_task(handler())

    while not task.done() and time.time() - start < 3:  # Асинхронно ждём 3 сек или пока не выполнится handler
        await asyncio.sleep(1)

    if task.done():
        result = task.result()
    else:
        result = "Time out!"

    print(result)
    await asyncio.sleep(10)


if __name__ == '__main__':
    asyncio.run(main())

Зачем?:

Пишу discord.py бота и хочу изменять сообщение на стандартное если handler не успел выполниться за определённое время, но нужно чтобы этот handler закончил работу

Ответы

Ответов пока нет.