使用run_forever运行监听websocket的async异步函数报错如何解决?
错误根因
- 第一个报错
TypeError: run_forever() takes 1 positional argument but 2 were given:run_forever()方法本身不接受任何传入参数,你将listen()返回的协程对象作为参数传入属于非法调用。 - 第二个警告
RuntimeWarning: coroutine 'listen' was never awaited:协程对象不能直接运行,必须先注册到事件循环中被调度才会执行,你没有完成注册步骤直接传入未执行的协程,就会触发该警告。 - 额外问题:你当前写的
listen函数仅会接收1次websocket消息就结束,不符合你持续监听的需求。
修复后代码
兼容旧版本Python写法
import asyncio import websockets async def listen(): url = "websocket url starting with wss" async with websockets.connect(url) as ws: # 加无限循环实现持续收消息 while True: msg = await ws.recv() print(msg) loop = asyncio.get_event_loop() # 先将协程封装为任务注册到事件循环 loop.create_task(listen()) try: # 无参调用run_forever保持循环运行 loop.run_forever() except KeyboardInterrupt: # 处理手动终止信号,优雅关闭循环 loop.close()
Python 3.7+ 简化写法
如果你使用Python 3.7及以上版本,可以直接用asyncio.run管理事件循环,写法更简洁:
import asyncio import websockets async def listen(): url = "websocket url starting with wss" async with websockets.connect(url) as ws: while True: msg = await ws.recv() print(msg) try: asyncio.run(listen()) except KeyboardInterrupt: pass
内容的提问来源于stack exchange,提问作者kc.chvz
相关产品推荐
相关产品推荐

