2009-02-03 58 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