В основном я хочу:
await action1()
await action2()
return result
с одним тайм-аутом для обоих действий и - это важно - с сообщением об ошибке, сообщающим, какое действие истекло.
Для сравнения только с однимaction:
try:
await asyncio.wait_for(action(), timeout=1.0)
except asyncio.TimeoutError:
raise RuntimeError("Problem")
Теперь с двумя действиями у меня есть это, и оно мне не нравится.
import asyncio
async def a2():
try:
await asyncio.sleep(1.0)
except asyncio.CancelledError:
raise RuntimeError("Problem 1") from None
try:
await asyncio.sleep(1.0)
except asyncio.CancelledError:
raise RuntimeError("Problem 2") from None
return True
async def test():
loop = asyncio.get_event_loop()
action_task = loop.create_task(a2())
# timeouts: 0.5 -> Problem1 exc; 1.5 -> Problem2 exc; 2.5 -> OK
try:
await asyncio.wait_for(action_task, timeout=0.5)
except asyncio.TimeoutError:
pass
result = await action_task
asyncio.get_event_loop().run_until_complete(test())
Я считаю, что действительно нелогично иметь:
except asyncio.TimeoutError:
pass
где обработка тайм-аута является основной функциональностью.Можете ли вы предложить лучший способ?