如果streams=True,Python请求模块不处理超时?

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

我正在使用 Python 请求模块获取一批 url。我首先只想读取它们的标头,以获取实际的 url 和响应大小。然后我会得到任何通过集合的实际内容。

所以我使用“streams=True”来延迟获取内容。这通常工作得很好。

但是我偶尔会遇到一个没有响应的网址。所以我设置了超时=3。

但是这些永远不会超时。他们只是挂着。如果我删除“streams=True”,它会正确超时。是否有某种原因导致流和超时不能一起工作?删除流=True 迫使我获取所有内容。

这样做:

import requests
url = 'http://bit.ly/1pQH0o2'
x = requests.get(url) # hangs
x = requests.get(url, stream=True) # hangs
x = requests.get(url, stream=True, timeout=1) # hangs
x = requests.get(url, timeout=3) # times out correctly after 3 seconds
python python-requests
3个回答
6
投票

有一个相关的 github 问题:

修复已包含在

requests==2.3.0
版本中。

使用最新版本对其进行了测试 - 对我有用。


4
投票

您会关闭您的回复吗?未关闭和部分读取的响应可以对同一资源建立多个连接,并且站点可能对单个 IP 有连接限制。


0
投票

我有一个解决方案的灵感来自于: ...请求/问题/1803#...30869031

from concurrent.futures import ThreadPoolExecutor


with ThreadPoolExecutor(max_workers=1) as executor:
    future = executor.submit(requests.get, url)
    response = future.result(timeout=3)  # 3 secs of timeout
© www.soinside.com 2019 - 2024. All rights reserved.