在 Python 请求中实现超时

Jay Shaw 2023年1月30日 2022年5月17日
  1. 在 Python 中为 URL 实现超时
  2. 使用 Python 中的请求模块在多个 URL 上实现超时
  3. 在超时参数中设置 None 以在 Python 请求中实现超时
  4. 实现超时以替代 Python 请求
  5. 结论
在 Python 请求中实现超时

本文介绍如何在 Python 请求中实现超时。

在从连接中获取数据时,超时必须在 request.get() 中放置一个计时器。如果连接花费的时间超过超时参数内所需的阈值,则 request.get() 会超时。

下面的示例解释了使用语法 requests.get() 为 Python 请求实现超时的不同方法。

在 Python 中为 URL 实现超时

该程序演示了使用 GET 从 URL 获取响应并在其中实现超时的方法。

  • 导入 Python 库 requests
  • 定义一个 try 块。
  • try 块中,声明一个变量 req 以存储来自所需 URL 的请求并设置超时参数。
  • 设置超时参数后,打印 req 查看响应。
  • except 块内,如果程序没有收到任何响应并打印消息,则设置异常。

try-except 块是一个异常处理块,它让程序执行一个函数并在出现异常时设置一个替代方案。

在这里,程序连接到 URL https://www.google.com 并执行 GET 命令。GET 命令从连接中获取响应,对于成功的连接,通常是 <Response [200]>

语法 timeout=(1) 告诉程序如果没有收到响应,则在 1 秒后超时连接。

例子:

import requests

try:
    req = requests.request('GET', 'https://www.google.com',timeout=(1))
    print(req)
except requests.ReadTimeout:
    print("READ TIME OUT")

输出:

"C:\Users\Win 10\main.py"
<Response [200]>

Process finished with exit code 0

使用 Python 中的请求模块在多个 URL 上实现超时

此示例演示了同时从多个 URL 获取响应的方法。在这个程序中,随着获取响应,超时参数将使用元组实现;例如,(x,y) 是一个元组。

超时可以设置为读取和连接中的元组,在程序内部单独指定。

timeout=(1,3) 表示连接计时器为 1 秒,读取计时器为 3 秒。

必须注意,给定的超时将应用于所有 URL。如果不同的 URL 需要不同的超时,程序应该包含 request.get() 函数,用于计算各种超时的次数。

  • 导入库包 requestsurllib3

    urllib3 处理程序尝试连接到防火墙无法识别的域时由互联网防火墙引起的异常。

    下面的语法禁用程序连接到不安全网站时出现的警告。

    urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)
    
  • try 块内,初始化变量 websites 以存储多个域。

  • 为变量 website 中存在的对象数量运行 for 循环 w

  • 初始化变量 r 以存储 request.get() 响应并指定超时 (3,3)。验证网站 TLS 证书的检查。

    它被赋予一个 false 值以避免异常抛出。

  • 打印变量 r

  • except 块中,将超时异常存储在 e 中并打印。

    例子:

    import requests as requests
    import urllib3
    urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)
    
    try:
        websites=['https://github.com','https://www.google.com', 'https://1337xto.to']
        for w in websites:
            r = requests.get(w, verify=False, timeout=(3,3))
            print(r)
    
    except requests.exceptions.Timeout as e:
        print(e)
    

    该程序尝试连接到三个 URL。成功连接到前两个后,程序会打印响应。

    在第三个 URL 中,由于 URL 需要超过 6 秒才能返回响应,因此程序会引发超时异常。

    输出:

    "C:\Users\Win 10\main.py"
    <Response [200]>
    <Response [200]>
    HTTPSConnectionPool(host='1337xto.to', port=443): Max retries exceeded with url: / (Caused by ConnectTimeoutError(<urllib3.connection.HTTPSConnection object at 0x0000022B3A202940>, 'Connection to 1337xto.to timed out. (connect timeout=3)'))
    
    Process finished with exit code 0
    

在超时参数中设置 None 以在 Python 请求中实现超时

在连接到非常慢的网站并且响应时间比通常需要的时间更长的特定情况下,超时设置为

例子:

import requests

try:
    req = requests.request('GET', 'https://1337xto.to', timeout=None)
    print(req)

except requests.ReadTimeout:
    print("READ TIME OUT")

实现超时以替代 Python 请求

Python 请求的 request.get() 超时有许多替代方案,但大多数都是多余的或不受支持的。本例中使用了第三方库包 eventlet 来执行超时。

  • 导入 Python 库包 - requestseventlet
  • monkey_patch 将标准 eventlet 库与它的绿色等效项进行修补。
  • try 块内,将 eventlet.Timeout 设置为所需的秒数。
  • 使用 request.get() 语法初始化变量 req 以存储 URL 响应。
  • except 块内,打印超时消息。

例子:

import requests
import eventlet
eventlet.monkey_patch()

try:
    with eventlet.Timeout(10):
        req = requests.get("http://ipv4.download.thinkbroadband.com/1GB.zip", verify=False)
        print(req)

except:
    print('timeout')

输出:

"C:\Users\Win 10\curl.py"
timeout

Process finished with exit code 0

结论

request.get() 中实现超时,用三个 Python 请求的示例代码进行说明,并在 eventlet 中再举一个例子来演示超时。

读完本文后,读者将能够在 Python 请求中实现超时。