使用python-socketio客户端向服务器发送事件为何异常缓慢?
问题分析与解决方案
核心问题1:客户端事件循环不统一
你调用asyncio.run(start())时,sio.wait()会持续占用当前事件循环,直到客户端断开。如果单独用asyncio.run(set_username(...))发送事件,会创建全新的事件循环,而新循环中的sio实例未建立有效连接,导致消息无法正常投递,表现为服务器延迟接收(实际是消息在无效循环中排队)。
客户端修复代码
需要在同一个事件循环内同时运行连接等待和事件发送任务,以下是两种实现方式:
Python 3.11+ 用TaskGroup
import socketio import asyncio sio = socketio.AsyncClient() async def start(): await sio.connect("http://localhost:8080", transports=['websocket']) async with asyncio.TaskGroup() as tg: tg.create_task(set_username("test_user")) tg.create_task(sio.wait()) async def set_username(name): await sio.wait_for_connection() # 确保连接建立后再发送 await sio.emit("set_name", name) if __name__ == "__main__": asyncio.run(start())
Python 3.10及以下 用create_task
import socketio import asyncio sio = socketio.AsyncClient() async def start(): await sio.connect("http://localhost:8080", transports=['websocket']) send_task = asyncio.create_task(set_username("test_user")) await sio.wait() await send_task async def set_username(name): await sio.wait_for_connection() await sio.emit("set_name", name) if __name__ == "__main__": asyncio.run(start())
核心问题2:服务器端同步处理函数的适配问题
你的set_name事件处理函数是同步的,虽然AsyncServer会将同步函数放入线程池执行,但长期来看可能阻塞事件循环,建议改为异步函数以保持框架一致性:
import socketio from aiohttp import web sio = socketio.AsyncServer() app = web.Application() sio.attach(app) @sio.event async def connect(sid, environ): print("Connected") @sio.event async def set_name(sid, name): print("Set name: " + name) if __name__ == "__main__": web.run_app(app)
验证方法
- 启动修复后的服务器
- 运行修复后的客户端,服务器会立即打印
Set name: test_user,无延迟现象
内容的提问来源于stack exchange,提问作者Salint
相关产品推荐
相关产品推荐

