You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

新手求助:如何使用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())

运行方式

  1. 启动服务端:
uvicorn main:app --reload
  1. 运行客户端脚本,即可接收并解析Dataframe。

优化建议

  • 若需持续传输更新数据,在服务端和客户端分别添加循环逻辑(服务端注释部分)。
  • 超大Dataframe可考虑分块传输,避免单次发送过大字节流导致的性能问题。
  • 若需要数据可读性,可替换MsgPack为JSON:用df.to_json()和pd.read_json()完成序列化/反序列化,代价是速度和体积略逊于MsgPack。

内容的提问来源于stack exchange,提问作者Shalder

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 01:11:05