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

Flask-SocketIO搭配Gunicorn+gevent单Worker可承载多少WebSocket客户端?

Flask + SocketIO + Gunicorn(GeventWebSocketWorker) 架构疑问解答

拟采用的架构

  • 常规Flask应用
  • SocketIO应用(基于Flask-SocketIO)
  • 搭配Gunicorn与gevent,使用GeventWebSocketWorker工作进程类
  • 单个Gunicorn工作进程

1. 架构实现原理(尤其是WebSocket并发机制)

这个架构的核心是gevent协程模型+GeventWebSocketWorker对WebSocket的适配:

  • Flask-SocketIO封装了SocketIO协议,同时兼容HTTP短连接和WebSocket长连接两种传输方式;
  • Gunicorn的GeventWebSocketWorker是为gevent定制的Worker类,它替代了默认的同步Worker,底层依托gevent的异步IO机制处理连接;
  • 每个请求(包括WebSocket连接)都会被封装为一个协程(Greenlet),协程是用户态的轻量级执行单元,无需操作系统线程上下文切换,单个Worker进程内可同时运行大量协程;
  • 对于WebSocket长连接,gevent会在连接建立后将其挂起(不会阻塞进程),只有当该连接有消息传入时才唤醒对应协程处理,实现单Worker同时维护多个WebSocket连接,且不影响常规HTTP请求的处理。

2. 为何单Worker能处理多个WebSocket连接?

你的疑惑源于传统WSGI同步Worker的认知,但GeventWebSocketWorker通过以下方式打破了限制:

  • 传统WSGI同步Worker是单进程单线程模式,一个请求会阻塞到处理结束,因此只能同时处理一个连接;但GeventWebSocketWorker依赖gevent的monkey-patch机制,会将Python标准库中的阻塞IO操作(如socket、select等)替换为异步非阻塞实现;
  • WebSocket连接完全在Gunicorn内部处理,GeventWebSocketWorker的作用是让Gunicorn能够识别WebSocket握手请求,并将连接交由gevent的事件循环管理;
  • 当WebSocket连接建立后,gevent不会让Worker进程一直阻塞在该连接上,而是将连接纳入事件循环,仅当连接有新消息时才触发对应协程处理,此时Worker可同时调度其他协程(如处理新HTTP请求、其他WebSocket的消息),本质是通过协程的异步调度实现单Worker多连接,而非依赖多线程/多进程。

3. 单Worker可承载的WebSocket客户端数量

没有固定数值,主要受以下因素影响:

  • 内存:每个WebSocket连接对应的协程内存占用极低(几KB到几十KB),单Worker的内存上限是核心瓶颈;若每个连接占用30KB,1GB内存的Worker理论可承载3万+连接;
  • 消息频率:客户端消息收发越频繁,协程切换的CPU消耗越高,可承载数量会相应降低;低消息频率场景(如推送通知)下,可承载数量会大幅提升;
  • 服务器配置:单Worker为单进程,CPU性能受限于单个核心的处理能力,网络带宽也会影响消息传输效率;
  • 业务逻辑:若消息处理涉及复杂计算或未被monkey-patch兼容的阻塞IO操作,会降低可承载数量。

常规配置(如1核2GB服务器)、低消息频率场景下,单Worker承载1万-5万个WebSocket连接是可行的;高消息频率场景下,数量可能降至几千到1万。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 19:09:29