基本上我想要:
await action1()
await action2()
return result
两个操作都有一个超时,而且-这很重要-有一个错误消息告诉哪个操作超时。你知道吗
作为比较,只需一个动作:
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
其中超时处理是主要功能。你能建议一个更好的方法吗?你知道吗
您的代码是正确的,但是如果您正在寻找更优雅的东西,也许上下文管理器适合您的使用:
使用方法如下:
最初为
aiohttp
开发的async_timeout模块可能正是您所需要的。它的回溯包含导致超时的行。你知道吗安装:
pip install async_timeout
用法:
输出:
第二行和第三行告诉您超时发生的位置:
相关问题 更多 >
编程相关推荐