替换python的httplib?

时间:2009-02-03 20:36:21

标签: python http curl twisted

我有一个python客户端,通过标准库的httlib推送大量数据。用户抱怨应用程序运行缓慢。我怀疑这可能部分归因于我正在使用的HTTP客户端。

我可以通过用其他东西替换httplib来提高性能吗?

我见过twisted提供了一个HTTP客户端。与其他协议产品相比,它似乎非常基础。

PyCurl可能是一个有效的替代方案,但是它的使用似乎非常不同于pythonic,另一方面如果它的性能非常好,那么我可以忍受一些非pythonic代码。

因此,如果您有更好的Python客户端库经验,请告诉我。我想知道你对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的替代方法。

8 个答案:

答案 0 :(得分:22)

通常当我遇到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)不要序列化您的请求。您可以使用线程或asynccore或任何您喜欢的,但如果您从不同的服务器发出多个请求,您可以通过并行运行来提高性能。

答案 1 :(得分:19)

  

用户抱怨应用程序运行缓慢。我怀疑这可能部分归因于我正在使用的HTTP客户端。

     

我可以通过用其他东西替换httplib来提高性能吗?

你是怀疑它还是确定它是httplib?在您做任何事情之前进行配置文件以提高应用程序的性能。

我已经找到了自己的直觉,花时间往往非常糟糕(假设没有一些代码内核执行数百万次)。实现某些东西以提高性能然后拉起应用程序并发现它没有任何区别真的令人失望。

如果你没有剖析,你就是在黑暗中拍摄!

答案 2 :(得分:5)

PyCurl非常棒,性能非常高。

答案 3 :(得分:2)

httplib2是另一种选择: http://code.google.com/p/httplib2/

与httplib相比,我从来没有对它进行基准测试或分析,但我也对那里的任何发现感兴趣。


十二月2012年更新: 我不再使用httplib2。现在使用 Requests :HTTP for Humans,任何带Python的http。

答案 4 :(得分:1)

你似乎在假设它的库。它的开源,所以值得检查代码是否值得。

您提到您通过HTTP发送了大量数据。效率低下可能是因为库,但HTTP不是发送大量数据的最有效协议。然后,它可能是简单使用库(你发送一个大字符串或列表,或使用流或生成器?)。

答案 5 :(得分:1)

正如其他人所说,httplib2是一个很好的选择,因为它可以正确处理标题并可以缓存响应,但我怀疑这对POST性能有帮助。

另一种可能会为POST带来性能提升的替代方案,尤其是在Windows上,是new HTTP 1.1 client in Twisted.web

答案 6 :(得分:0)

httplib2是一个非常好的选择。 Joe Gregorio修复了许多httplib错误。

答案 7 :(得分: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

的解决方案