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

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

验证方法

  1. 启动修复后的服务器
  2. 运行修复后的客户端,服务器会立即打印Set name: test_user,无延迟现象

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 22:30:17