websockets:Python 异步 WebSocket 的正确选择

websockets 在 GitHub 上拿到了 5,687 Star。

这个库专攻一件事:用 Python 构建正确的、可靠的 WebSocket 服务端和客户端。基于 asyncio,代码简洁到只有两个核心操作——recv() 收消息,send() 发消息。还提供了 threading 版本,同步场景也能直接用。

1、 它是什么

一个纯粹的 WebSocket 库。不做 HTTP,不做花活,只实现 RFC 6455(WebSocket 协议)和 RFC 7692(压缩扩展)。

内置 asyncio 版本是主力,几行代码就能跑一个 echo 服务:

import asyncio
from websockets.asyncio.server import serve

async def echo(websocket):
    async for message in websocket:
        await websocket.send(message)

async def main():
    async with serve(echo, "localhost", 8765) as server:
        await server.serve_forever()

asyncio.run(main())

不喜欢异步?同步客户端同样干净:

from websockets.sync.client import connect

def hello():
    with connect("ws://localhost:8765") as websocket:
        websocket.send("Hello world!")
        message = websocket.recv()
        print(f"Received: {message}")

正文顶部截图

2、 为什么选它

四个原则贯穿整个项目:

正确性。 对 RFC 6455 的合规测试覆盖极严,CI 要求 100% 分支覆盖。RFC 里的每一条规则都有测试盯着。

简洁性。 就两个核心操作:recv() 收,send() 发。连接管理、心跳、关闭握手全由库处理,你不用操心底层细节。

鲁棒性。 它是第一个正确处理 WebSocket 背压的 Python 库。这个坑在 Python 异步社区被广泛讨论之前,websockets 就已经填上了。

性能。 内存占用可配置,关键路径有 C 扩展加速。Linux、macOS、Windows 三平台都预编译好了 wheel 包,pip install 直接装,不需要本地编译。

文档也是项目的一等公民,Read the Docs 上的教程和 API 参考都很完整。

README区域截图

3、 什么时候不该用它

两个场景不太合适:

偏好回调风格而不是协程的话,websockets 不太对路。这个库的立身之本就是提供最好的 coroutine-based WebSocket API。

需要同时处理 HTTP 和 WebSocket 的场景,websockets 的 HTTP 支持只够健康检查用。这种情况建议用 uvicorn 或 Sanic,它们在 websockets 之上封装了 HTTP + WebSocket 的能力。

4、 适合谁

  • 用 Python 做实时通信的开发者:消息推送、聊天、协作编辑
  • 对协议合规性有要求的项目:金融、医疗等需要严格的协议实现
  • 需要生产级 WebSocket 服务的团队:背压处理、C 扩展加速开箱即用
  • 不想在连接管理上花时间的人:交给库就行,专注业务逻辑

Tidelift 提供企业级商业支持,维护者直接参与订阅服务。

扩展加速开箱即用

  • 不想在连接管理上花时间的人:交给库就行,专注业务逻辑

Tidelift 提供企业级商业支持,维护者直接参与订阅服务。

更多推荐