[英]Python & HTTPX: How does httpx client's connection pooling work?
考慮這個 function 向 API 端點發出簡單的 GET 請求:
import httpx
def check_status_without_session(url : str) -> int:
response = httpx.get(url)
return response.status_code
每次調用 function check_status_without_session
時,運行此 function 將打開一個新的 TCP 連接。 現在,HTTPX 文檔的這一部分建議使用Client
API,同時向同一個 URL 發出多個請求。以下 function 會執行此操作:
import httpx
def check_status_with_session(url: str) -> int:
with httpx.Client() as client:
response = client.get(url)
return response.status_code
根據文檔,使用Client
將確保:
... Client 實例使用 HTTP 連接池。 這意味着當您向同一主機發出多個請求時,客戶端將重用底層 TCP 連接,而不是為每個請求重新創建一個連接。
我的問題是,在第二種情況下,我已將Client
上下文管理器包裝在 function 中。如果我使用相同的 URL 多次調用check_status_with_session
,難道不會在每次調用 function 時創建一個新的連接池嗎? 這意味着它實際上並沒有重用連接。 由於 function 堆棧在 function 執行后被銷毀, Client
object 也應該被銷毀,對吧? 這樣做有什么好處還是有更好的方法?
這樣做有什么好處還是有更好的方法?
不,以您展示的方式使用httpx.Client
沒有任何優勢。 事實上httpx.<method>
API,例如httpx.get
,做的是完全一樣的事情!
“池”是Client
持有的傳輸管理器的一個特性,默認情況下是HTTPTransport
。 傳輸在Client
初始化時創建並存儲為實例屬性self._transport
。
創建一個新的Client
實例意味着一個新的HTTPTransport
實例,傳輸實例有自己的 TCP 連接池。 每次都創建一個新的Client
實例並且只使用它一次,與直接使用httpx.get
,您沒有任何好處。
那可能沒問題。 連接池是對為每個請求創建新的 TCP 連接的優化,您的應用程序可能不需要該優化。 它可能已經足夠滿足您的需求了。
如果您在緊密循環中向同一個端點發出許多請求,則在循環上下文中進行迭代可能會.net 您會獲得一些吞吐量增益,例如
with httpx.Client(base_url="https://example.com") as client:
results = [client.get(f"/api/resource/{idx}") for idx in range(100)]
對於此類 I/O 繁重的工作負載,您可以通過並行執行結果來做得更好,例如使用httpx.AsyncClient
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.