在默认情况下,除非显式指定了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")