You need to enable JavaScript to run this app. 使用run_forever运行监听websocket的async异步函数报错如何解决?
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.11 07:54:03