在默认情况下,除非显式指定了timeout
值,requests 是不会自动进行超时处理的。如果没有timeout
,你的代码可能会挂起若干分钟甚至更长时间。
为防止服务器不能及时响应,大部分发至外部服务器的请求都应该带着timeout
参数。
设置超时时间
超时(Timeout)设置主要分为两类:
- 连接超时(Connect Timeout):客户端等待与服务器建立连接的最大时间;
- 读取超时(Read Timeout):客户端等待服务器返回数据的最大时间;
requests
默认情况下没有设置超时时间(timeout = None
),这意味着你的请求会一直等待响应,直到成功或发生底层网络错误( DNS 解析失败,TCP 拒绝连接);
使用元组timeout = (connect_timeout, read_timeout)
同时设置连接超时和读取超时,单位为秒:
r = requests.get('https://github.com', timeout=(5.05, 20))
或者共用一个值:
r = requests.get('https://github.com', timeout=5)
超时时间推荐范围:
- 连接超时:3 ~ 10 秒
- 读取超时:10 ~ 30 秒
超时异常处理
示例中的timeout
设置的极小,用于触发异常;
若请求超时,则抛出一个Timeout
异常:
import requests
try:
response = requests.get("http://google.com",timeout=0.01)
except requests.exceptions.Timeout:
print("timeout")
也可分别处理连接超时和读取超时:
import requests
try:
response = requests.get("http://google.com",timeout=(10,0.01))
except requests.exceptions.ConnectTimeout:
print("connect timeout")
except requests.exceptions.ReadTimeout:
print("read timeout")