新手求助:如何使用FastAPI和Websocket传输Python Dataframe?
用FastAPI + Websocket实现Dataframe跨进程高效传输
核心思路
Websocket是双向长连接,避免了HTTP请求的重复握手开销,适合高频或大数据量的进程间数据传输,相比xlwings能显著提升速度。我们可以把Dataframe序列化为MsgPack(比JSON更紧凑、序列化/反序列化速度更快)后通过Websocket传输,另一端再反序列化为Dataframe。
步骤1:安装依赖
pip install fastapi uvicorn pandas msgpack-python
步骤2:服务端代码(发送Dataframe)
负责启动Websocket服务,生成/读取Dataframe并发送给客户端:
from fastapi import FastAPI, WebSocket import pandas as pd import msgpack app = FastAPI() @app.websocket("/ws/dataframe") async def websocket_endpoint(websocket: WebSocket): await websocket.accept() try: # 替换成你的Dataframe生成/读取逻辑 df = pd.DataFrame({ "col1": [1, 2, 3, 4], "col2": ["a", "b", "c", "d"], "col3": [1.1, 2.2, 3.3, 4.4] }) # 将Dataframe序列化为MsgPack字节流 df_bytes = df.to_msgpack() await websocket.send_bytes(df_bytes) print("Dataframe已发送") # 如需持续发送更新的Dataframe,取消下方注释 # import asyncio # while True: # # 重新生成/更新Dataframe # df = pd.DataFrame(...) # df_bytes = df.to_msgpack() # await websocket.send_bytes(df_bytes) # await asyncio.sleep(1) # 控制发送间隔 except Exception as e: print(f"发送出错: {e}") finally: await websocket.close()
步骤3:客户端代码(接收Dataframe)
在另一个进程中运行,连接Websocket并解析收到的Dataframe:
import websockets import pandas as pd import msgpack import asyncio async def receive_dataframe(): async with websockets.connect("ws://localhost:8000/ws/dataframe") as websocket: # 接收MsgPack字节流 df_bytes = await websocket.recv() # 反序列化为Dataframe df = pd.read_msgpack(df_bytes) print("收到的Dataframe:") print(df) if __name__ == "__main__": asyncio.run(receive_dataframe())
运行方式
- 启动服务端:
uvicorn main:app --reload
- 运行客户端脚本,即可接收并解析Dataframe。
优化建议
- 若需持续传输更新数据,在服务端和客户端分别添加循环逻辑(服务端注释部分)。
- 超大Dataframe可考虑分块传输,避免单次发送过大字节流导致的性能问题。
- 若需要数据可读性,可替换MsgPack为JSON:用
df.to_json()和pd.read_json()完成序列化/反序列化,代价是速度和体积略逊于MsgPack。
内容的提问来源于stack exchange,提问作者Shalder
相关产品推荐
相关产品推荐

