当前位置:首页 > 文章列表 > 文章 > python教程 > Python websockets ping_interval 和 ping_timeout 怎么配合保活

Python websockets ping_interval 和 ping_timeout 怎么配合保活

来源:17golang原创 2026-11-05 15:13:37 0浏览 收藏

Python 的 websockets 里,这两个参数不是同一个“超时时间”:ping_interval 决定多久主动发一次 Ping,ping_timeout 决定发出 Ping 后等多久还没收到 Pong 就判定连接不可用。一般先保留默认的 20 秒和 20 秒;只有确认代理空闲时限、网络延迟或服务端处理能力后,再调整其中一个。

官方地址:https://websockets.readthedocs.io/en/stable/topics/keepalive.html

要点速览
  • ping_interval 负责产生持续流量,防止长连接被中间设备当成空闲连接清理。
  • ping_timeout 负责判断 Pong 是否及时返回;它太小会把高延迟误判成断线。
  • 需要保持连接但允许延迟尖峰时设 ping_timeout=None;设 ping_interval=None 则连保活和心跳判断一起关闭。

先看 ping_interval 和 ping_timeout 各管什么

当前稳定版文档中的 connect() 和 serve() 都支持这两个参数。默认配置会周期性发送 WebSocket Ping,并等待匹配的 Pong。前者解决“长时间没有业务消息”的空闲问题,后者解决“对端已经慢到不可用”的判断问题。

参数它控制什么设为 None 的含义常见风险
ping_interval两次 keepalive Ping 的间隔关闭整套 keepalive 与 heartbeat代理可能按空闲连接清理
ping_timeout等待 Pong 的最长时间保留 Ping,但不因 Pong 超时关闭故障连接可能长期挂着
Python websockets ping_interval 与 ping_timeout 的保活参数关系说明图
图1:Python websockets 两个心跳参数的静态关系说明图,不是运行截图或线上监控证据。

所以“把两个值都调成 5 秒”并不等于保活更可靠:它会增加 Ping 流量,也会让短暂抖动更快触发关闭。参数应围绕链路中的空闲时限和可接受故障发现时间来定。

从旧配置迁移到可解释的心跳组合

如果旧代码只写了 websockets.connect(url),升级时不需要为了迁移强行增加业务心跳。先把参数显式写出来,方便审查和按环境调整:

import asyncio
from websockets.asyncio.client import connect
from websockets.exceptions import ConnectionClosed

async def consume(uri: str) -> None:
    # 20 秒发一次 Ping,20 秒内等不到 Pong 才关闭连接。
    async with connect(uri, ping_interval=20, ping_timeout=20) as ws:
        try:
            async for message in ws:
                # 业务消息仍由接收循环处理,不能把 Ping 当作业务心跳。
                print(message)
        except ConnectionClosed as exc:
            # 关闭原因交给上层重连策略,当前函数只负责记录并退出。
            print(f"WebSocket closed: code={exc.code} reason={exc.reason}")

asyncio.run(consume("wss://example.invalid/socket"))

三种组合可以先这样理解:

  • 默认组合:适合大多数稳定公网连接,既保持流量又能发现失联。
  • ping_timeout=None:适合允许偶发长延迟、但仍要避免代理把连接视为空闲的场景;代价是不会靠 Pong 超时主动清理。
  • ping_interval=None:只适合由应用层或基础设施明确负责保活的场景,不能再期待 websockets 自动发现断线。

这里不建议把业务层“每 10 秒发一条 JSON heartbeat”和协议 Ping 混成一件事。协议 Ping 由库自动处理,应用层心跳只有在服务端定义了业务状态、租约或客户端可见确认时才有必要。

Python websockets 保活配置与超时关闭边界说明图
图2:根据空闲链路、延迟尖峰和业务心跳职责选择配置的静态边界说明图。

用异常和延迟指标判断是否真的断开

看到 ConnectionClosedError: sent 1011 ... keepalive ping timeout,首先说明的是 Pong 没有在当前 ping_timeout 窗口内回来,不一定说明服务端进程已经停止。官方 FAQ 把常见原因归为网络质量变差、接收方处理不过来,或者代理没有正确支持长连接。

排查时按下面顺序做,避免直接把超时值无限调大:

  1. 记录关闭码、原因和发生时间,区分正常关闭与异常关闭。
  2. 检查代理或负载均衡的空闲连接时限,确认它大于 ping_interval,并留出网络抖动余量。
  3. 在可控诊断窗口调用一次 await ws.ping() 并等待返回的延迟值,观察是偶发尖峰还是持续升高。
  4. 如果确认只是延迟尖峰,再增大 ping_timeout;如果是对端无响应,继续调大只会延迟故障发现。
async def sample_latency(ws) -> float:
    # ping() 返回等待对应 Pong 的 awaitable,结果是近似往返延迟秒数。
    pong_waiter = await ws.ping()
    latency = await pong_waiter
    return latency

上线前回归检查与边界清单

迁移完成后,至少覆盖四个状态:空闲连接能跨过代理的清理窗口;正常消息流不会被误当成协议 Ping;临时高延迟不会频繁误断;真正断网时上层能收到 ConnectionClosed 并执行自己的重连或告警策略。

  • 客户端和服务端是否都明确写了参数,避免一侧默认值变化时无人知晓。
  • ping_interval 是否小于链路中最短的空闲清理时间,并考虑抖动。
  • ping_timeout 是否大于正常高峰期的往返延迟,而不是只按本地局域网延迟设置。
  • 是否把协议级保活和业务级心跳、鉴权租约、重连退避分开记录。

常见问题

只把 ping_timeout 设为 None 会不会不再保活?

不会。Ping 仍按 ping_interval 发送,只是不再因为 Pong 超时自动关闭连接。需要自行监控异常连接,避免失联连接无限占用资源。

为什么 ping_interval 调小后断线反而变多?

更短的间隔会提高检测频率,也会增加流量和对短暂延迟的敏感度。先确认代理空闲时限,再按可接受的故障发现时间调整,不要只追求更小数字。

websockets 会自动处理对端发来的 Ping 吗?

会,协议层 Ping/Pong 由库处理。只有服务端另行定义了业务层心跳格式时,才需要在应用代码里实现对应消息。

版本声明
本文转载于:17golang原创 如有侵犯,请联系study_golang@163.com删除
HTTPX Limits 怎么分别限制连接池和空闲连接数量HTTPX Limits 怎么分别限制连接池和空闲连接数量
上一篇
HTTPX Limits 怎么分别限制连接池和空闲连接数量
machinectl import-tar 怎么把压缩容器镜像导入本机
下一篇
machinectl import-tar 怎么把压缩容器镜像导入本机
查看更多
最新文章
查看更多
课程推荐
  • 前端进阶之JavaScript设计模式
    前端进阶之JavaScript设计模式
    设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
    543次学习
  • GO语言核心编程课程
    GO语言核心编程课程
    本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
    516次学习
  • 简单聊聊mysql8与网络通信
    简单聊聊mysql8与网络通信
    如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
    500次学习
  • JavaScript正则表达式基础与实战
    JavaScript正则表达式基础与实战
    在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
    487次学习
  • 从零制作响应式网站—Grid布局
    从零制作响应式网站—Grid布局
    本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
    485次学习
查看更多
AI推荐
  • PubMedQA数据集详解:生物医学问答基准、功能与应用指南
    PubMedQA
    深入了解PubMedQA生物医学问答数据集,涵盖其核心功能、使用方法及在临床决策、药物研发等场景的应用,助力提升NLP模型性能。
    893次使用
  • H2O EvalGPT:开源LLM大模型评估与排行榜工具
    H2O EvalGPT
    H2O EvalGPT是H2O.ai推出的开源LLM评估平台,提供详细的大模型性能排行榜、行业特定基准测试及A/B测试功能,助您快速选择最适合项目的高性能大语言模型。
    896次使用
  • LMArena是什么?伯克利AI模型评估平台使用指南与功能解析
    LMArena
    LMArena是加州大学伯克利分校推出的AI模型匿名评测平台。通过盲测投票机制,用户可对比不同大模型回答并生成实时排行榜,助力开发者优化模型及用户选择最佳AI工具。
    981次使用
  • 斯坦福HELM:大语言模型Holistic Evaluation整体评估框架详解
    HELM
    深入了解斯坦福推出的HELM(Holistic Evaluation of Language Models)大模型评测体系。本文解析其核心功能、安装配置步骤及应用场景,涵盖准确性、公平性、鲁棒性等多维度指标,助力开发者全面优化语言模型性能。
    968次使用
  • MMBench详解:多模态大模型基准测试、功能特点与使用指南
    MMBench
    MMBench是由上海人工智能实验室等机构联合推出的多模态基准测试平台,提供细粒度能力评估、大规模数据集及VLMEvalKit工具。本文详细介绍其核心功能、安装使用方法及应用场景,助力开发者全面评估多模态模型性能。
    794次使用
微信登录更方便
  • 密码登录
  • 注册账号
登录即同意 用户协议 和 隐私政策
返回登录
  • 重置密码