如何使用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
相关产品推荐
相关产品推荐

