在 Python 請求中實現超時

Jay Shaw 2023年1月30日
  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 請求中實現超時。