簡體   English   中英

Python & HTTPX:httpx 客戶端的連接池是如何工作的?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM