11

標準ライブラリのhttlibを介して大量のデータをプッシュするpythonクライアントがあります。ユーザーは、アプリケーションが遅いと不満を漏らしています。これは、私が使用している HTTP クライアントが原因の一部であると思われます。

httplib を別のものに置き換えることでパフォーマンスを改善できますか?

twisted が HTTP クライアントを提供しているのを見てきました。他のプロトコル製品と比較して、非常に基本的なようです。

PyCurl は有効な代替手段かもしれませんが、その使用は非常に非 Pythonic のように見えますが、パフォーマンスが本当に優れている場合は、少しの非 Pythonic コードを我慢できます。

Python のより優れた 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 の代替手段について知りたいです。

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", '/バー')
    conn = httplib.HTTPConnection("www.somewhere.com")
    conn.request("GET", '/baz')

代わりにこれを行います:

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

(2) リクエストをシリアライズしないでください。スレッドや非同期コアなど、好きなものを使用できますが、異なるサーバーから複数のリクエストを行う場合は、それらを並行して実行することでパフォーマンスを向上させることができます。

于 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のパフォーマンスに役立つとは思えません。

特に Windows で POST のパフォーマンスを実際に向上させる代替手段は、Twisted.web の新しい HTTP 1.1 クライアントです。

于 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 倍速く動作し始めました (1087ms から 87ms)。http://www.velocityreviews.com/forums/t668272-problem-with-slow-httplib-connections-on-windows-and-maybe-otherplatforms.htmlからのソリューション

于 2011-07-20T22:21:18.870 に答える