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

如何使用Python requests模块向服务器流式传输实时增长的海量数据?

流式上传实时增长数据的解决方案

问题原因

当你将BytesIO对象传入requests.post的data参数时,requests会一次性读取整个流直到EOF(文件结束标记),后续写入流的内容不会被发送——因为请求的数据流已经被提前读取完毕。

解决方案

使用可迭代对象/生成器作为data参数,requests会迭代读取每一部分数据并实时发送到服务器,直到迭代结束。这种方式既避免了内存耗尽,又能实时发送新生成的数据,且无需修改服务器代码。

基础示例代码

import time
import requests

def data_generator():
    # 发送初始数据
    yield b"Foo"
    # 模拟处理生成新数据的耗时操作
    time.sleep(1)
    # 发送后续生成的数据
    yield b'Bar'
    # 传输结束时发送标识
    yield b'EndOfBatch'

# 发起流式请求
requests.post("http://127.0.0.1:8085", data=data_generator())

动态数据生成场景示例

如果数据是从实时数据源(如消息队列、外部接口)动态获取的,可修改生成器为循环读取:

import time
import requests

def dynamic_data_generator():
    # 模拟从实时数据源获取数据的过程
    for chunk_idx in range(5):
        time.sleep(1)
        # 生成并发送数据块
        yield f"Real-time chunk {chunk_idx}".encode('utf-8')
    # 发送结束标识
    yield b'EndOfBatch'

requests.post("http://127.0.0.1:8085", data=dynamic_data_generator())

原理说明

requests对data参数的可迭代对象支持会逐块读取数据,每读取到一块就立即通过HTTP连接发送,直到迭代器抛出StopIteration异常(即生成器执行完毕)。这种分块传输的方式完全符合HTTP流式请求的标准,服务器无需修改即可正常接收数据。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 18:15:16