You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python Websockets技术问题:Room类中异步函数未使用await引发运行时警告

解决asyncio异步函数调用未加await的问题

嘿,刚接触asyncio框架确实容易踩这种协程未被正确执行的坑,我来帮你搞定这个问题~

错误原因分析

你遇到的RuntimeWarning: coroutine 'Room.send_msg_to_all' was never awaited是典型的异步函数调用错误:用async def定义的函数调用后会返回一个协程对象,必须通过await关键字等待它执行,或者交给事件循环去调度执行,否则协程根本不会真正运行。

你的Room.send_msg_to_all方法本身的实现是没问题的(里面正确用了await去调用participant.conn.send),问题出在你调用这个异步方法的地方没有加await——比如你代码里的这一行:

self.send_msg_to_all(str(serialized_partipants_info))

正确的解决方式

根据你调用send_msg_to_all的场景,有两种常见的正确处理方式:

1. 在异步函数内用await调用

如果你的调用代码本身就在一个异步函数(用async def定义)里,直接给调用加上await关键字即可:

async def update_participants(self):
    # 假设这是你序列化参与者信息的逻辑
    serialized_partipants_info = {"users": [p.name for p in self.participants]}
    # 正确调用异步方法:加await
    await self.send_msg_to_all(str(serialized_partipants_info))

2. 在同步函数内用asyncio.create_task调度

如果你的调用代码在一个普通的同步函数(def定义)里,无法直接使用await,可以用asyncio.create_task()把协程包装成一个任务,交给事件循环自动执行:

import asyncio

def on_participant_join(self, new_participant):
    self.participants.append(new_participant)
    serialized_partipants_info = {"users": [p.name for p in self.participants]}
    # 创建任务交给事件循环执行
    asyncio.create_task(self.send_msg_to_all(str(serialized_partipants_info)))

额外注意事项

  • 确保你的整个服务器是运行在asyncio事件循环中的,比如入口代码用asyncio.run()启动主协程:
async def main():
    # 初始化你的服务器逻辑
    pass

if __name__ == "__main__":
    asyncio.run(main())
  • 不要混用线程和asyncio,除非你清楚怎么用asyncio.run_coroutine_threadsafe()这种线程安全的方法,刚接触的话尽量全程用异步范式来写代码。

内容的提问来源于stack exchange,提问作者Tomek Pulkiewicz

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 15:48:11