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
相关产品推荐
相关产品推荐

