惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

月光博客
月光博客
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
阮一峰的网络日志
阮一峰的网络日志
罗磊的独立博客
T
Tailwind CSS Blog
博客园_首页
博客园 - 司徒正美
Google DeepMind News
Google DeepMind News
Hugging Face - Blog
Hugging Face - Blog
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
V
V2EX
J
Java Code Geeks
量子位
D
DataBreaches.Net
MongoDB | Blog
MongoDB | Blog
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
Microsoft Azure Blog
Microsoft Azure Blog
P
Proofpoint News Feed
C
Check Point Blog
V
Visual Studio Blog
H
Help Net Security
Recent Announcements
Recent Announcements
Engineering at Meta
Engineering at Meta

V2EX - 技术

牛逼了,我的阿里云百炼 Coding Plan Pro 莫名被永久封禁,联系客服,无法解封。寻求替代。 Antigravity 断连 Local-first 软件收录站 从 X 上搬运来的白嫖 GPT Plus 教程 阿里云百炼 Coding Plan Pro 套餐 新增当日 token 限制 大家的 Claude 弹了 kyc 嘛 现在 Google 的 Gemini 和 AI 模式降智的厉害啊 用的 TAG 家的 T, ip 跳变是否影响使用 claude 同一 apple 账户能给不同 claude 账号充值么 做了个 Go 的 MCP Server 框架,一行代码把 Gin API 接入 AI 请教各位,想回归技术,如何系统学习 Agent? OpenAI GPT-IMAGE-2 提示词合集 你是说, claude opus4.6 写代码的能力不如 gpt5.4? 关于智谱 Max 套餐要不要升级续费呢? App → CLI → App ? Github 账号被 404 了,现在没法恢复,求各位大佬指点 cursor 的次数套餐以后应该都用不了新模型了 openrouter 使用国外模型 买了咸鱼低价 Gemini pro,账号差点被盗。突然发现国内诈骗成本为零 Gemini 手机版客户端登陆总是在此国家/地区无法使用 gemini 感觉 gpt 这些低价渠道要爆了 claude code 和 codex 在 vibe coding 还有质的区别吗? 阿里 Coding Plan 一天三变, Lite 版本到期不能续费了 RAG 难以让人满意啊 2026 年了,这个世界还存在互联网精神🥹 两个账号阵亡,尼区 Claude Pro 订阅 分享下最近低价 GPT Codex 的来源(源头) OpenAI 发布 Codex 重大更新:支持自动操作电脑与长期任务自动化 使用 claude 从 0 开始开发一个校友会系统可行吗 同一个 appleid 可以给不同 chatGPT 账号订阅 plus 吗?
Python WebSocket 长连接到底怎么写才稳?
matters · 2026-06-17 · via V2EX - 技术

最近在做实时行情相关的项目,刚开始觉得很简单:连上、收消息、处理数据就完事了。结果线上跑几天后发现各种问题:

  • 网络抖动导致连接断开
  • 服务端主动踢连接
  • 长时间没消息被中间设备断开
  • 重连太频繁把自己服务器打挂

后来重新整理了一套比较稳的方案,核心有 3 个:

  • 心跳
  • 重连
  • 退避机制

1.心跳不能省

WebSocket 建立连接不一定就一直在线。运营商网络、NAT 设备、负载均衡器都可能清理长时间无流量的连接。所以一定要做心跳。 如果服务端支持 ping/pong ,直接使用协议层心跳即可。 如果不支持,可以定时发送业务心跳消息。 例如:

async def heartbeat(ws):

    while True:

        try:

            await ws.ping()

            await asyncio.sleep(30)

        except Exception:

            break

30 秒左右发一次通常就够用了。

2.重连是标配

WebSocket 断开是常态,不是异常。所以不要把代码写成:

await websocket.recv()

然后指望它永远不掉线。 我觉得应该是:

while True:

    try:

        await connect()

    except Exception as e:

        print(e)

    await asyncio.sleep(5)

连接断开以后自动重新建立连接。这样即使服务端重启或者网络闪断,也能自动恢复。

3.别直接疯狂重连

一个常见错误可能是⬇️

断线:

while True:

    try:

        connect()

    except:

        pass

结果:

  • CPU 飙高
  • 日志刷爆
  • 服务端压力暴增

这时候就需要退避机制,也就是每次失败后逐渐增加等待时间。例如:

delay = 1

while True:

    try:

        await connect()

        delay = 1

    except Exception:

        await asyncio.sleep(delay)

        delay = min(delay \* 2, 60)

等待时间变成 1s 、2s 、4s 、8s 、16s 、32s 、60s...

连接恢复后再重置。这样会稳定很多。

4.WebSocket 行情订阅

连接建立后订阅需要的品种即可,以 BTC 为例:

import asyncio

import json

import websockets

WS\_URL = "wss://quote.alltick.io/quote-b-ws-api"

API\_TOKEN = "YOUR\_API\_TOKEN"

async def subscribe():

    async with websockets.connect(WS\_URL) as ws:

        sub\_msg = {

            "cmd\_id": 22002,

            "seq\_id": 1,

            "trace": "test",

            "data": {

                "symbol\_list": \[

                    {

                        "code": "BTCUSDT"

                    }

                \]

            },

            "token": API\_TOKEN

        }

        await ws.send(json.dumps(sub\_msg))

        while True:

            msg = await ws.recv()

            print(msg)

asyncio.run(subscribe())

如果是生产环境,我一般会把:

  • 连接管理
  • 心跳任务
  • 重连逻辑
  • 退避机制

全部封装到一个 ConnectionManager 里面。业务层只负责消费消息,不关心连接状态。这样后面维护会轻松很多。