在 Python 请求中实现超时
- 在 Python 中为 URL 实现超时
- 使用 Python 中的请求模块在多个 URL 上实现超时
-
在超时参数中设置
None
以在 Python 请求中实现超时 - 实现超时以替代 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()
函数,用于计算各种超时的次数。
-
导入库包
requests
和urllib3
。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 库包 -
requests
和eventlet
。 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 请求中实现超时。