python+websockets,报错RuntimeError: no running event loop
最近有个需求,需要用到websockts,之前顶多也就是作为客户端去请求数据,这次要写服务端,之前也没有写过,上网找了一下资料,还是挺多的。
资料一,资料二
一般从最基础的来嘛,就是写个echo,返回收到的值就行了
import asyncio
import websocketsasync def echo(websocket, path):async for message in websocket:print(f"收到消息: {message}")await websocket.send(f"服务器响应: {message}")# 启动 WebSocket 服务器
start_server = websockets.serve(echo, "0.0.0.0", 8765)asyncio.get_event_loop().run_until_complete(start_server)
asyncio.get_event_loop().run_forever()
结果执行直接报错,RuntimeError: no running event loop。
我就很费解啊,又上网找资料,各种找,发现说来说去,提供的代码跟这个差不多,顶多一个是加了一个set_event_loop但是没用,我不懂,也就不深究了。
后来发现,我在另一台电脑可以执行成功的,然后顺势发现,因为我的websockets库已经升级至14.0,最新版是15.0.1,而以上代码在12.0是可以运行的,但如果我降级的话,gradio会提示需要websockets在13.0之上,怀疑可能是13.0之后有个大升级,导致对旧版本不一定兼容,如果直接降级的话,那相关的库都要跟着一起降。但是到底做了什么升级,新版应该怎么写,一筹莫展。最后问了下文心,回答就不贴了,就是给了两个解决方法,其中之一就还是上面那个set,但提供了另一个,还真的能解决。换成以下形式。
async def main():async with websockets.serve(echo, "0.0.0.0", 9999):await asyncio.Future()if __name__ == "__main__":asyncio.run(main())
不过真正运行的时候,还是会报错,说是找不到path这个参数。
再次搜索之下,这次就全搜出来了
ptyhon websockets库报错 ...conn_handler... missing 1 required positional argument: ‘path‘_connection handler failed-CSDN博客
这篇文章中,有些比较详细的启动代码,我这边就不贴了。
以此记录一下,困扰了我半天的问题,差点还没入门就放弃。话说这种库更新后,应该去哪查官方文档,半天也没搜到,这一更新后,网上的资料就都过时了,且变成直接无法使用。
