我专门使用 python 版本
3.10
来运行 websocket(或任何长 asyncio
进程)一段指定的时间段,这在 python 文档中有介绍。 .wait_for()
方法看起来是正确的解决方案。
我运行此代码(来自文档):
import asyncio
async def eternity():
# Sleep for one hour
await asyncio.sleep(3600)
print('yay!')
async def main():
# Wait for at most 1 second
print('wait for at most 1 second...')
try:
await asyncio.wait_for(eternity(), timeout=1.0)
except TimeoutError:
print('timeout!')
asyncio.run(main())
文档在这里: https://docs.python.org/3/library/asyncio-task.html?highlight=wait_for#asyncio.wait_for
但是,我收到以下错误:
Exception has occurred: TimeoutError
exception: no description
...基本上,
TimeoutError
异常没有按预期处理。
我的研究表明其他人一直在与错误作斗争,例如这里: 处理 Python 套接字中的超时错误
但是这些修复要么已经过时(与 3.10 无关),要么不起作用。我还注意到文档指定了“版本 3.10 中的更改:删除了循环参数”。所以我只对
3.10
及以上版本感兴趣。
所以我想知道如何让最小可重现的示例工作或者我做错了什么?
您可以删除 TimeoutError,以便它可以跳转到 print('timeout') 或者可以使用此示例来输出错误
except Exception as exc:
print(f'The exception: {exc!r}')
Python 中有很多超时错误。
将 except TimeoutError 替换为 except asyncio.TimeoutError 就可以了。
更新完整示例:
import asyncio
async def eternity():
# Sleep for one hour
await asyncio.sleep(3600)
print('yay!')
async def main():
# Wait for at most 1 second
print('wait for at most 1 second...')
try:
await asyncio.wait_for(eternity(), timeout=1.0)
except asyncio.TimeoutError:
print('timeout!')
asyncio.run(main())
显然 asyncio 文档中的示例是错误的(或者至少是误导性的)。 如果你查看 CPython 的源代码,asyncio.TimeoutError 在 Python 3.10 之前是与 TimeoutError 不同的异常,并且在 3.11 中更改为 TimeoutError 的别名。