讲师中心 微信公众号
AI工具推荐 视频效率加速

Python FastAPI实现高并发WebSocket 异步长连接性能优化方案【实战】

阿晨小哥_7749

阿晨小哥_7749

发布时间:2026-05-31 07:21:35

|

477人浏览过

|

来源于php中文网

原创

单机支撑5000+ WebSocket连接的关键在于:防连接泄漏(用set管理+异常清理)、广播并发安全(asyncio.gather分批发送+心跳过滤)、杜绝同步阻塞(移除time.sleep/requests等,CPU密集操作进线程池)。

python fastapi实现高并发websocket 异步长连接性能优化方案【实战】

单机撑住 5000+ 活跃 WebSocket 连接,关键不在框架选型,而在三个地方是否做对:连接管理是否防泄漏、广播是否并发安全、同步调用是否被混入异步函数里。

async def websocket_endpoint() 里不能出现任何同步阻塞操作

常见错误现象是:连接数一过百,所有客户端开始卡顿、延迟飙升,websocket.receive_text() 响应变慢,甚至整个服务无响应。这不是 CPU 或带宽瓶颈,而是事件循环被某个同步操作锁死了。

  • time.sleep()、requests.get()、json.loads()(尤其解析 >1MB 的 JSON)必须移除或替换
  • HTTP 调用改用 httpx.AsyncClient,数据库换 asyncpg 或 aiomysql,别碰 psycopg2 和 pymysql
  • CPU 密集型操作(如大 JSON 解析、AES 加密)必须进线程池:await asyncio.to_thread(json.loads, data)
  • Pydantic 校验默认同步,高频场景建议关掉 validate_assignment=False,或直接用 model_validate_json() 避免重复解析

active_connections 用 list 就是内存泄漏定时炸弹

用 active_connections = [] 然后 .append(websocket) + for conn in active_connections: 发送消息,看似简单,实则危险。客户端异常断开(比如关浏览器、网络中断)时,websocket.send_text() 会抛出 WebSocketDisconnect 或 OSError,若没捕获,该连接对象就永远留在列表里 —— 内存持续上涨,几天后 OOM。

  • 必须改用 set:self.active_connections: set[WebSocket] = set(),天然去重、增删快
  • 每次广播前,对每个连接做 try/except,捕获 WebSocketDisconnect 和通用 Exception,失败后立即 connection_set.discard(ws)
  • 加心跳检测:在 while True: 循环内定期 await websocket.ping(),超时(比如 30 秒无响应)主动 await websocket.close()
  • 生产环境务必监控:psutil.Process().memory_info().rss 定期打点,配合连接数趋势判断泄漏

广播消息不能 for-loop + await 逐个发

当有 2000 个连接时,for conn in conns: await conn.send_text(msg) 是串行执行,耗时线性增长;更糟的是,一个连接发送失败(比如网络抖动),后续所有连接都会被阻塞到异常处理完。

提示词大师-python版
提示词大师-python版

图片提示词生成器?不止如此。 马甲系统 —— 把脑海中的画面,翻译成AI能理解的专业表达。 用得越多,它越懂你:首次需要多问几句确认方向,用久了几乎一说就懂。 用得越多,它越快:缓存机制让后续对话越来越省。 RAG进化:成功案例持续入库,越跑越聪明。 输入「新手指南」查看完整功能介绍

下载

立即学习“Python免费学习笔记(深入)”;

  • 必须用 asyncio.gather(*tasks, return_exceptions=True) 并发发送,例如:await asyncio.gather(*[conn.send_text(msg) for conn in conns], return_exceptions=True)
  • 连接数超 1000 时,建议分批(如每 200 个一组),避免一次性创建太多 task 压垮 event loop
  • 广播前先过滤掉已失效连接(靠心跳或上次发送异常标记),减少无效调用
  • 前端 Luckysheet 类协同场景,只广播 delta 操作(如 {"v": "new value", "r": 2, "c": 3}),而非整表 JSON,体积可降 90%

Uvicorn worker 数和并发限制必须手动配死

很多人照抄 gunicorn main:app -k uvicorn.workers.UvicornWorker -w 4 就上线,结果压测时 CPU 上下文切换飙升、文件描述符耗尽、内存翻倍 —— 因为 Uvicorn 是单线程异步模型,每个 worker 独占一个事件循环,盲目加 -w 反而降低吞吐。

  • worker 数推荐:CPU 核心数 × 1~1.5(例如 4 核机器设 -w 4 或 -w 6)
  • 必须加 --limit-concurrency 100,防止单个 worker 接收过多连接压垮内存
  • 启用 --ws-per-message-deflate 开启 WebSocket 压缩,文本消息体积平均减少 40%+
  • 生产环境禁用 --reload,它会 fork 多进程导致连接状态不同步、心跳失效、广播漏发

最易被忽略的点是:连接清理不是“发生异常才做”,而是要变成广播流程里的固定步骤;心跳不是“可选项”,而是连接生命周期管理的基础设施。没有这两条,其他优化都只是延缓崩溃时间。

相关文章

数码产品性能查询
数码产品性能查询

该软件包括了市面上所有手机CPU,手机跑分情况,电脑CPU,电脑产品信息等等,方便需要大家查阅数码产品最新情况,了解产品特性,能够进行对比选择最具性价比的商品。

下载

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

墨刀AI
墨刀AI Hot

一款AI图像与设计工具,主要用于产品经理的专属智能体,适合需要提升相关任务效率的用户。

音述AI
音述AI Hot

一款AI音频处理工具,主要用于音述AI是一个以“用声音述说故事”为核心的 AI 音乐创作与声音分享社区,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

Lovart
Lovart Hot

一款面向视觉设计创作的AI设计平台,可通过智能体和画布工作流辅助制作海报、Logo、网页、PPT及其他视觉内容。

VibeKnow
VibeKnow Hot

一款AI视频创作工具,主要用于全球首个AI知识视频创作平台,文档、文章、网页,一键生成视频,适合需要提升相关任务效率的用户。

二狗PPT
二狗PPT Hot

一款AI演示文稿工具,主要用于专为中式职场打造的AI PPT生成工具,适合需要提升相关任务效率的用户。

讯飞绘文

讯飞绘文是一款由科大讯飞推出的一站式 AIGC 内容运营平台。

相关专题

更多
python打包成可执行文件
python打包成可执行文件

本专题为大家带来python打包成可执行文件相关的文章,大家可以免费的下载体验。

1631

2023.07.20

python能做什么
python能做什么

python能做的有:可用于开发基于控制台的应用程序、多媒体部分开发、用于开发基于Web的应用程序、使用python处理数据、系统编程等等。本专题为大家提供python相关的各种文章、以及下载和课程。

3944

2023.07.25

format在python中的用法
format在python中的用法

Python中的format是一种字符串格式化方法,用于将变量或值插入到字符串中的占位符位置。通过format方法,我们可以动态地构建字符串,使其包含不同值。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

1629

2023.07.31

python教程
python教程

Python已成为一门网红语言,即使是在非编程开发者当中,也掀起了一股学习的热潮。本专题为大家带来python教程的相关文章,大家可以免费体验学习。

22737

2023.08.03

python环境变量的配置
python环境变量的配置

Python是一种流行的编程语言,被广泛用于软件开发、数据分析和科学计算等领域。在安装Python之后,我们需要配置环境变量,以便在任何位置都能够访问Python的可执行文件。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2787

2023.08.04

python eval
python eval

eval函数是Python中一个非常强大的函数,它可以将字符串作为Python代码进行执行,实现动态编程的效果。然而,由于其潜在的安全风险和性能问题,需要谨慎使用。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2827

2023.08.04

scratch和python区别
scratch和python区别

scratch和python的区别:1、scratch是一种专为初学者设计的图形化编程语言,python是一种文本编程语言;2、scratch使用的是基于积木的编程语法,python采用更加传统的文本编程语法等等。本专题为大家提供scratch和python相关的文章、下载、课程内容,供大家免费下载体验。

1123

2023.08.11

python合并两个列表
python合并两个列表

Python是一种强大的编程语言,具有许多方便的功能和工具。在Python中,有多种方法可以合并两个列表。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

596

2023.08.10

LLVM自定义Pass怎么写
LLVM自定义Pass怎么写

本专题聚焦LLVM自定义Pass开发,整理Pass类结构、run()方法、PreservedAnalyses、CMake构建、插件注册、-load-pass-plugin加载和测试用例编写流程。

0

2026.09.30

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn