我正在使用 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
您会关闭您的回复吗?未关闭和部分读取的响应可以对同一资源建立多个连接,并且站点可能对单个 IP 有连接限制。
我有一个解决方案的灵感来自于: ...请求/问题/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