gpt4 book ai didi

python - requests 的 stream=True 选项如何一次一个 block 地流式传输数据?

转载 作者:行者123 更新时间:2023-12-03 18:05:26 41 4
gpt4 key购买 nike

我正在使用以下代码来测试一个 HTTP 连接可以保持多少秒:

    start_time = time.time()
try:
r = requests.get(BIG_FILE_URL, stream=True)
total_length = r.headers['Content-length']
for chunk in r.iter_content(chunk_size=CHUNK_SIZE):
time.sleep(1)
# ... except and more logic to report total time and percentage downloaded
为了确保 Python 不会一次下载所有内容并创建一个生成器,我使用了 tcpdump。它确实每秒发送一个数据包(大约),但我没有找到是什么让服务器一次发送一个 block 以及请求库是如何做到这一点的。
我检查了几个 SOF 问题并查看了 requests 库文档,但是所有资源都解释了如何使用该库来下载大文件,并且没有一个解释 stream=True 选项的内部结构。
我的问题是:tcp 协议(protocol)或 HTTP 请求 header 中的什么使服务器一次发送一个 block 而不是一次发送整个文件?
编辑+可能的答案:
在使用 Wireshark 之后,我发现 Python 使用 TCP 的滑动窗口来实现它。意思是,它不会在下一个 block 未被调用时发送确认。
这可能会导致一些意外行为,因为滑动窗口可能比 block 大很多,并且代码中的 block 可能不代表实际的数据包。
示例:如果将 block 设置为 1000 字节,则 64K 的默认滑动窗口(我在 Ubuntu 18 上的默认值)将导致立即发送 64 个 block 。如果主体大小小于 64K,则连接可能会立即关闭。因此,这对于保持在线连接不是一个好主意。

最佳答案

这在用户文档中没有解释。
通过查看 requests 的源代码,我发现如果我们设置 stream=Truerequests.get(...)然后 headers['Transfer-Encoding'] = 'chunked'在 HTTP header 中设置。从而指定分 block 传输编码。在分 block 传输编码中,数据流被分成一系列不重叠的“ block ”。这些 block 由服务器彼此独立地发送出去。
希望这能回答这个问题。

关于python - requests 的 stream=True 选项如何一次一个 block 地流式传输数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60343944/

41 4 0