Python asyncio: продолжение выполнения поле timeout
У меня есть 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 закончил работу
Источник: Stack Overflow на русском