我有一個函式,用于檢查特定的 HTTP(S) URL 是否是重定向,如果是,則回傳新位置(但不是遞回)。它使用requests圖書館。它看起來像這樣:
try:
response = http_session.head(sent_url, timeout=(1, 1))
if response.is_redirect:
return response.headers["location"]
return sent_url
except requests.exceptions.Timeout:
return sent_url
在這里,我正在檢查的 URL 是sent_url. 作為參考,這就是我創建會話的方式:
http_session = requests.Session()
http_adapter = requests.adapters.HTTPAdapter(max_retries=0)
http_session.mount("http://", http_adapter)
http_session.mount("https://", http_adapter)
但是,該程式的要求之一是這必須適用于死鏈接。基于此,我設定了連接超時(并為良好的措施讀取超時)。在玩弄這些值之后,無論我選擇什么值,請求仍然需要大約 5-10 秒才能通過此堆疊跟蹤失敗。(也許相關:在瀏覽器中,它給出DNS_PROBE_POSSIBLE.)
現在,我的問題是:如果鏈接失效,5-10 秒的等待時間太長了。這個程式需要檢查的鏈接很多,我不希望幾個死鏈接成為這么大的瓶頸,因此我想配置這個DNS查找超時。
我發現這個帖子似乎是相關的(OP想要增加超時,我想減少它)但是解決方案似乎不適用。我不知道這些 URL 指向的 IP 地址。此外,多年前的這個功能請求似乎很相關,但并沒有進一步幫助我。
到目前為止,對我來說最好的解決方案似乎只是為每個鏈接/一批鏈接啟動一個協程,然后異步吸收超時。
我在 Windows 10 上,但是此代碼將部署在 Ubuntu 服務器上。兩者都使用 Python 3.8。
那么,我怎樣才能最好地為我的 HTTP 請求提供一個非常低的 DNS 決議超時,以防它被提供一個死鏈接?
uj5u.com熱心網友回復:
那么,我怎樣才能最好地為我的 HTTP 請求提供一個非常低的 DNS 決議超時,以防它被提供一個死鏈接?
分開的東西。
用于urllib.parse從 URL 中提取主機名,然后使用dnspython您想要的任何超時來決議該名稱。
然后,并且僅當決議正確時,才啟動requests以獲取 HTTP 資料。
@blurfus:在requestsHTTP 呼叫中只能使用 timeout 引數,不能將其附加到會話中。檔案中沒有明確說明,但代碼對此非常清楚。
這個程式需要檢查的鏈接有很多,
這實際上是一個完全獨立的問題,即使所有鏈接都正常也存在,只是數量問題。
典型的解決方案分為兩種情況:
- 使用異步庫(它們存在于 DNS 和 HTTP 中),您的呼叫不會阻塞,稍后您會獲得資料,因此您可以做其他事情
- 使用多處理或多執行緒來并行化事物,并通過單獨的代碼實體同時測驗多個 URL。
它們并不完全相互排斥,你可以找到很多優點和缺點,異步代碼可能在以后撰寫和理解起來更復雜,所以多處理/多執行緒通常是“快速取勝”的第一步(特別是如果你不需要在行程/執行緒之間共享任何內容,否則它很快就會成為一個問題),但是所有內容的異步處理使代碼可以更好地隨體積擴展。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/351500.html
