为什么 PUT 请求会超时,而 GET 请求不会超时

问题描述 投票:0回答:1

使用 python requests 库并指定超时时,当处理请求的总时间超过超时时,GET 请求不会超时,但 PUT 请求会超时。

python版本:3.8.10 请求版本:2.32.3

示例代码:

start = datetime.now()
requests.get(URL_WITH_1GB_FILE, params=None, headers={"User-Agent": "Mozilla/5.0"}, timeout=(1,1), verify=cert)
print(f"GET: {datetime.now()-start}")

即使整个请求需要 60 多秒才能完成,我们也不会超时。我相信这是预期的行为,因为单个数据包是在 1 秒超时内收到的。

但是,当尝试使用 PUT 请求执行相同的操作时,请求会超时,除非连接超时大于完成整个 PUT 请求所需的时间。

示例代码:

with open(PATH_TO_1GB_FILE ,"rb" ) as f:
    dat = f.read()
    timeouts = (100, 1) # connect, read
    start = datetime.now()
    requests.put(f"{local}/puttest", params=None, headers={"User-Agent": "Mozilla/5.0"}, timeout=timeouts, data=dat, verify=cert)
    print(f"PUT: {datetime.now()-start}")

如果连接超时设置为 100 秒,则上传成功,因为上传大约需要 60 秒,但是如果连接超时设置为 10 秒,则上传失败。

我正在以 1mbps 连接上传 100MB 文件,这需要 13 分钟的超时,但是我希望在互联网连接断开时更早触发超时。

我知道我可以通过发送较小的块而不是完整的 100MB 文件来实现此目的,但我很好奇是否有一种方法可以让超时更好地处理这种情况。

python python-requests
1个回答
0
投票

我似乎已经找到了解决问题的方法,但它与我对超时的理解不太相符。

期望的目标是当互联网连接断开时,请求应该超时,但如果整个请求花费很长时间,我不希望它超时,因为我在慢速连接上发送大量数据。

在实践中,我可以通过将连接超时指定为很长的时间(或无),并让读取超时为合理的值,使用 PUT 请求来实现此目的。

with open(PATH_TO_1GB_FILE ,"rb" ) as f:
    dat = f.read()
    timeouts = (None, 60) # connect, read
    start = datetime.now()
    requests.put(f"{local}/puttest", params=None, headers={"User-Agent": "Mozilla/5.0"}, timeout=timeouts, data=dat, verify=cert)
    print(f"PUT: {datetime.now()-start}")

此代码允许整个请求无限期地执行,但如果互联网连接丢失,则会在一分钟内超时。

© www.soinside.com 2019 - 2024. All rights reserved.