news 2026/6/22 16:45:53

Python 长连接实现方式全景解析

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Python 长连接实现方式全景解析

一、什么是“长连接”(Long-lived Connection)

长连接指客户端与服务端建立连接后,在较长时间内保持不关闭,用于多次通信或持续数据流传输。

核心目标:

  • 降低频繁建连/断连的开销(TCP / TLS)
  • 实现实时通信、流式数据、推送能力
  • 支撑高并发、低延迟业务场景

二、Python 实现长连接的主流方式总览

通信层级来看,Python 的长连接可以分为:

层级技术
HTTP 层Keep-Alive / SSE
应用协议层WebSocket
传输层TCP Socket
异步模型asyncio / uvloop
消息系统Redis Pub/Sub 等

下面逐一展开。


三、HTTP 长连接(Keep-Alive)

1. 原理说明

HTTP/1.1 默认开启Connection: keep-alive
同一个 TCP 连接可复用多次 HTTP 请求。

⚠️ 注意:
HTTP 长连接 ≠ 实时通信
它只是“连接复用”,不是推送模型。


2. 适用场景

  • 内部 API 调用
  • 微服务间 RPC
  • 高频短请求(如模型推理接口)

3. 示例代码(requests + Session)

importrequests session=requests.Session()foriinrange(10):resp=session.get("http://localhost:8000/health")print(resp.status_code)session.close()
原理点
  • Session内部维护连接池
  • 复用 TCP 连接,减少握手开销

4. 优缺点分析

优点

  • 实现简单
  • 与现有 HTTP 服务完全兼容

缺点

  • 不支持服务端主动推送
  • 连接空闲易被 LB / Nginx 断开

5. 生产注意事项

  • Nginxkeepalive_timeout
  • 服务端最大连接数
  • 不适合实时推送类业务

四、WebSocket(全双工长连接)

1. 原理说明

WebSocket 基于 HTTP 握手升级协议:

HTTP → Upgrade → WebSocket

特点:

  • 全双工
  • 服务端可主动推送
  • 一个连接可持续通信

2. 典型使用场景

  • 实时消息 / IM
  • 模型流式输出(Token Streaming)
  • 实时监控面板
  • 在线协作

3. FastAPI WebSocket 示例

服务端
fromfastapiimportFastAPI,WebSocketimportasyncio app=FastAPI()@app.websocket("/ws")asyncdefwebsocket_endpoint(ws:WebSocket):awaitws.accept()try:whileTrue:data=awaitws.receive_text()awaitws.send_text(f"echo:{data}")exceptException:awaitws.close()
客户端测试脚本
importasyncioimportwebsocketsasyncdeftest_ws():asyncwithwebsockets.connect("ws://localhost:8000/ws")asws:awaitws.send("hello")resp=awaitws.recv()print(resp)asyncio.run(test_ws())

4. 优缺点分析

优点

  • 真正的实时通信
  • 支持流式数据

缺点

  • 状态连接,消耗资源
  • LB 场景需粘性会话

5. 生产级注意事项

  • 心跳(ping/pong)
  • 最大连接数控制
  • Nginxproxy_read_timeout
  • Kubernetes 下需Session Affinity

五、Server-Sent Events(SSE)

1. 原理说明

  • 基于 HTTP
  • 单向:服务端 → 客户端
  • 使用text/event-stream

2. 适用场景

  • 实时通知
  • 日志流
  • AI 模型流式输出(无双向需求)

3. FastAPI SSE 示例

服务端
fromfastapiimportFastAPIfromfastapi.responsesimportStreamingResponseimporttime app=FastAPI()defevent_generator():foriinrange(5):yieldf"data: message{i}\n\n"time.sleep(1)@app.get("/sse")defsse():returnStreamingResponse(event_generator(),media_type="text/event-stream")
客户端测试脚本
importrequests resp=requests.get("http://localhost:8000/sse",stream=True)forlineinresp.iter_lines():ifline:print(line.decode())

4. 优缺点

优点

  • 比 WebSocket 简单
  • HTTP 原生,穿透性好

缺点

  • 单向通信
  • 浏览器连接数限制

六、TCP Socket 长连接(底层方案)

1. 原理说明

  • 直接基于 TCP
  • 自定义协议
  • 需自行处理粘包、心跳、重连

2. asyncio TCP 示例

服务端
importasyncioasyncdefhandle(reader,writer):whileTrue:data=awaitreader.read(1024)ifnotdata:breakwriter.write(data)awaitwriter.drain()asyncio.run(asyncio.start_server(handle,"0.0.0.0",9000))
客户端
importasyncioasyncdefclient():reader,writer=awaitasyncio.open_connection("127.0.0.1",9000)writer.write(b"ping")awaitwriter.drain()data=awaitreader.read(1024)print(data)writer.close()asyncio.run(client())

3. 适用场景

  • 游戏服务器
  • 自定义高性能协议
  • 内部 RPC

4. 风险点

  • 实现成本高
  • 协议设计复杂
  • 调试困难

七、异步长连接模型(asyncio / uvloop)

核心价值

  • 单线程支撑万级连接
  • IO 多路复用(epoll)
importasyncioimportuvloop asyncio.set_event_loop_policy(uvloop.EventLoopPolicy())

结论
生产级长连接,几乎必用 asyncio


八、消息系统模拟“长连接”

Redis Pub/Sub 示例

importredis r=redis.Redis()pubsub=r.pubsub()pubsub.subscribe("events")formsginpubsub.listen():print(msg)

特点

  • 解耦
  • 非真实 TCP 长连接
  • 更适合集群广播

九、Python 如何测试长连接(重点)

1. 长时间保持连接

whileTrue:ws.send("ping")time.sleep(30)

2. 心跳机制

  • WebSocket ping/pong
  • TCP 自定义 heartbeat
  • 超时主动关闭

3. 并发测试(asyncio)

asyncdefrun(n=1000):tasks=[test_ws()for_inrange(n)]awaitasyncio.gather(*tasks)

十、生产级最佳实践总结

什么时候用长连接?

✅ 实时
✅ 高频交互
✅ 流式输出

什么时候不用?

❌ 请求极少
❌ LB 无法保持会话
❌ 资源极度受限


十一、方案对比表

技术通信模型推送并发复杂度推荐
HTTP Keep-Alive请求/响应⭐⭐⭐
WebSocket全双工⭐⭐⭐⭐⭐
SSE单向流⭐⭐⭐⭐
TCP Socket自定义极高⭐⭐⭐
Redis Pub/Sub消息间接⭐⭐⭐⭐

十二、最终结论

**Python 生产级长连接首选:
asyncio + WebSocket(或 SSE)
TCP 仅在极致性能或特殊协议下使用

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/22 6:16:49

基于SpringBoot的同城宠物服务管理系统

同城宠物服务管理系统的课题背景 随着城市化进程加快和居民生活水平提高,宠物经济成为新兴消费热点。宠物已从单纯的看家护院角色转变为家庭重要成员,宠物饲养率逐年攀升,带动宠物食品、医疗、美容、寄养等服务需求激增。然而,传统…

作者头像 李华
网站建设 2026/6/19 10:18:53

【深度学习新浪潮】用AI工具解析美联储新闻,搭建量化投资分析流水线

更多分析内容,请参考我们的浮游会播客:美联储降息竟然影响你的钱包?如何把握机会、守住财富? 引言:美联储新闻+AI,解锁投资决策新范式 美联储作为全球货币政策的“锚点”,其利率决议、会议声明、官员讲话等每一条新闻都可能引发全球资产剧烈波动。但传统分析模式面临两…

作者头像 李华
网站建设 2026/6/21 21:41:09

Android 14.0 监听某个app启动或者退出功能实现

1.前言 在进行14.0的系统定制开发中,在某些app的定制过程中,需要知道某个app的启动记录和退出记录, 所以就需要监听某个app的启动和退出的过程,需要在Activity的生命周期中来实现监听功能 2.监听某个app启动或者退出功能实现的核心类 frameworks\base\core\java\android…

作者头像 李华
网站建设 2026/6/22 10:55:50

DNP3设备数据 转 IEC104项目案例

目录 1 案例说明 2 VFBOX网关工作原理 3 准备工作 4 配置网关采集DNP3协议数据 5 启用IEC104协议转发数据 6 测试网关的104功能 7 网关通过4G连接104平台 8 案例总结 1 案例说明 设置网关采集DNP3协议设备数据把采集的数据转成IEC104协议转发给其他系统。 2 VFBOX网关…

作者头像 李华
网站建设 2026/6/21 13:16:11

DDR应用专题总结

一、DDR设计之硬件设计 1.DDR硬件设计是T型结构还是非T型结构,直接关系到DDR能够跑的最高速率 2.DDR核电1.5v/1.8v/2.0v选择很重要,关系到DDR速率是否能够跑高二、MIG复位 1.mig核的init_cmpl概率性性起不来,需要在逻辑中设计一个复位&#x…

作者头像 李华
网站建设 2026/6/22 2:25:38

人脸识别项目如何在Spring Boot项目中如何建立数据库和管理

讲讲在Spring Boot项目中如何建立数据库和管理 随着智能门禁、考勤、访客系统的普及,人脸识别模块已成为众多项目的重要组成部分。在高性能的人脸识别系统中,数据库主要负责持久化存储,而识别比对操作应全部在内存中完成,以保证毫…

作者头像 李华