使用 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 文件来实现此目的,但我很好奇是否有一种方法可以让超时更好地处理这种情况。
我似乎已经找到了解决问题的方法,但它与我对超时的理解不太相符。
期望的目标是当互联网连接断开时,请求应该超时,但如果整个请求花费很长时间,我不希望它超时,因为我在慢速连接上发送大量数据。
在实践中,我可以通过将连接超时指定为很长的时间(或无),并让读取超时为合理的值,使用 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}")
此代码允许整个请求无限期地执行,但如果互联网连接丢失,则会在一分钟内超时。