11

我有一个 python 客户端,它通过标准库的 httlib 推送大量数据。用户抱怨应用程序很慢。我怀疑这可能部分是由于我使用的 HTTP 客户端。

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

我已经看到twisted 提供了一个HTTP 客户端。与他们的其他协议产品相比,它似乎非常基础。

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

因此,如果您有更好的 Python HTTP 客户端库的经验,请告诉我。我想知道您对 httplib 相关性能的看法以及您对实现质量的看法。

UPDATE 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 的一些替代方案。

4

8 回答 8

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 或任何您喜欢的东西,但是如果您从不同的服务器发出多个请求,您可以通过并行运行它们来提高性能。

于 2009-02-03T20:44:37.213 回答
20

用户抱怨应用程序很慢。我怀疑这可能部分是由于我使用的 HTTP 客户端。

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

怀疑它还是你确定它是httplib?在你做任何事情来提高你的应用程序的性能之前进行分析。

我发现我自己对时间花在哪里的直觉通常很糟糕(假设没有一些代码内核执行了数百万次)。实施一些东西来提高性能然后拉起应用程序并看到它没有任何区别,这真的很令人失望。

如果您不进行分析,那么您就是在黑暗中拍摄!

于 2009-02-03T20:53:12.547 回答
5

PyCurl 很棒,而且性能非常好。

于 2009-02-03T23:36:07.053 回答
2

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

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


2012 年 12 月更新:我不再使用 httplib2。现在使用Requests : HTTP For Humans,用于任何带有 Python 的 http。

于 2009-02-03T21:38:43.780 回答
1

您似乎认为它是图书馆。它是开源的,因此值得检查代码以查看它是否是。

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

于 2009-02-03T20:44:32.440 回答
1

正如其他人回答的那样,httplib2 是一个很好的选择,因为它可以正确处理标头并可以缓存响应,但我怀疑这会有助于提高 POST 性能。

Twisted.web 中的新 HTTP 1.1 客户端可能实际上可以提高 POST 的性能,尤其是在 Windows 上

于 2009-02-05T10:33:18.817 回答
0

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

于 2009-02-04T04:37:50.410 回答
0

它适用于我的 Windows 机器:使用 Py 2.3(不支持 IPv6)这只是 IPv4 地址,但使用 Py 2.4-2.6 的顺序是(在我的 Win XP 主机上)首先是 IPv6 地址,然后是 IPv4 地址。由于首先检查 IPv6 地址,这会导致超时并导致缓慢的 connect() 调用。

我只将“localhost”更改为 127.0.0.1,它开始工作的速度提高了 10 倍(从 1087 毫秒到 87 毫秒)。来自http://www.velocityreviews.com/forums/t668272-problem-with-slow-httplib-connections-on-windows-and-maybe-otherplatforms.html的解决方案

于 2011-07-20T22:21:18.870 回答