2009-02-03 94 views
10

我有一個python客戶端,它通過標準庫的httlib推送大量數據。用戶抱怨應用程序很慢。我懷疑這可能部分是由於我使用的HTTP客戶端。替代python的httplib?

我可以通過用別的東西替換httplib來提高性能嗎?

我見過這種扭曲提供了一個HTTP客戶端。與其他協議產品相比,它似乎非常基礎。

PyCurl可能是一個有效的選擇,但它的使用似乎是非pythonic,另一方面,如果它的性能非常好,那麼我可以忍受一些非pythonic代碼。

所以,如果你有更好的HTTP客戶端庫的經驗,請告訴我關於它。我想知道您對httplib的性能以及您對實現質量的看法。

更新0:我使用httplib的是實際上非常有限 - 更換需要做到以下幾點:

conn = httplib.HTTPConnection(host, port) 
conn.request("POST", url, params, headers) 
compressedstream = StringIO.StringIO(conn.getresponse().read()) 

這就是:沒有代理,重定向或任何花哨的東西。這是簡單的HTTP。我只需要儘可能快地做到這一點。

更新1:我與Python2.4卡住了,我正在使用Windows 32.請不要告訴我有關使用httplib的更好方法 - 我想了解一些httplib的替代方法。

回答

21

通常,當我遇到httplib的性能問題時,問題不在於httplib本身,而在於我如何使用它。這裏有幾個常見的陷阱:

(1)不要爲每個Web請求建立一個新的TCP連接。如果要進行大量的請求到同一臺服務器,而不是這種模式:

 
    conn = httplib.HTTPConnection("www.somewhere.com") 
    conn.request("GET", '/foo') 
    conn = httplib.HTTPConnection("www.somewhere.com") 
    conn.request("GET", '/bar') 
    conn = httplib.HTTPConnection("www.somewhere.com") 
    conn.request("GET", '/baz') 

而是執行此操作:

 
    conn = httplib.HTTPConnection("www.somewhere.com") 
    conn.request("GET", '/foo') 
    conn.request("GET", '/bar') 
    conn.request("GET", '/baz') 

(2)不要序列您的要求。你可以使用線程或asyncccore或任何你喜歡的,但是如果你從不同的服務器發出多個請求,你可以通過並行運行來提高性能。

+0

這不是一個真正的HTTP流水線;它仍然是一個保持活力的持久HTTP。 對於真正的HTTP流水線,請參閱實際使用Python httplib的這段代碼。 [鏈接](http:// code。activestate.com/recipes/576673-python-http-pipelining/) – 2015-09-03 13:48:40

1

你似乎認爲它的圖書館。它的開源代碼,所以值得檢查一下代碼是否值得。

你提到你通過HTTP發送大量數據。效率低下可能是因爲該庫,但HTTP並不是發送大量數據的最有效的協議。再次,它可能是庫的簡單使用(你是發送一個大的字符串或列表,還是使用流或生成器?)。

+0

的解決方案是的,但我也測試了一堆其他的東西。我真的很想找到其他HTTP客戶端庫的好處。我不維護服務器,所以除了使用HTTP之外別無選擇。 – 2009-02-03 21:08:42

+0

+1爲具有挑戰性的假設。 – 2009-02-03 21:22:46

+0

夠公平的。你的修改後的問題更好,並且清楚:) – 2009-02-03 21:58:49

19

用戶抱怨應用程序很慢。我懷疑這可能部分是由於我使用的HTTP客戶端。

我可以通過用別的東西替換httplib來提高性能嗎?

嫌疑它還是你肯定它的httplib?在您做任何事情來改善您的應用程序的性能之前的配置文件

我已經找到了自己的直覺,認爲時間花在哪裏通常很糟糕(因爲沒有一些代碼內核執行了數百萬次)。實現某些東西來提高性能真的讓人失望,然後拉起應用程序,看看它沒有什麼區別。

如果你不分析,你是在黑暗中拍攝!

+0

+1用於推薦性能分析。 – 2009-02-03 21:22:16

2

httplib2的是另一種選擇: http://code.google.com/p/httplib2/

我從來沒有基準或比較httplib的異形,但我也有興趣在任何發現那裏。


2012年12月更新: 我不再使用httplib2。現在使用Requests:HTTP對於人類來說,任何使用Python的http。

5

PyCurl非常棒,性能極高。

0

httplib2是一個非常好的選擇。喬格雷戈里奧修復了許多httplib的bug。

1

正如其他人所回答的那樣,httplib2是一個不錯的選擇,因爲它正確地處理標題並且可以緩存響應,但是我懷疑這會對POST性能有所幫助。

的替代方案,實際上可能給你職位的性能提升,特別是在Windows,是new HTTP 1.1 client in Twisted.web

0

它工作在我的Windows機器上: 隨着PY 2.3(不支持IPv6),這是唯一的IPv4地址, 但用Py 2.4-2.6的順序是(在我的Win XP主機上)首先使用IPv6地址 ,然後是IPv4地址。由於首先檢查IPv6地址,因此 會給出超時並導致connect()調用緩慢。

我只改變了「localhost」到127.0.0.1,它開始工作10倍(從1087ms到87ms)。 從http://www.velocityreviews.com/forums/t668272-problem-with-slow-httplib-connections-on-windows-and-maybe-otherplatforms.html