2012-05-11 15 views
7

可能性の重複:
Multiple (asynchronous) connections with urllib2 or other http library?Pythonで複数のHTTPリクエストを送信する理想的な方法は?

私は、サードパーティのAPIからHTTPを介してリアルタイムのデータをつかむためにPythonコードを実行し、LinuxのWebサーバに取り組んでいます。データはMySQLデータベースに格納されます。 多くのURLに対して多くのクエリを実行する必要があり、高速化する必要があります(より速い方が良い)。現在、私はHTTPライブラリとしてurllib3を使用しています。 これについてはどのような方法が最適ですか?私は複数のスレッドを生成する必要がありますか? 私はあなたの考えを聞いて欲しいです - ありがとう!

答えて

23

たくさんの場合は本当にたくさんです。

requests + gevent = grequests

GRequestsあなたは簡単に非同期のHTTP要求を行うことGeventとの要求を使用することができます。

import grequests 

urls = [ 
    'http://www.heroku.com', 
    'http://tablib.org', 
    'http://httpbin.org', 
    'http://python-requests.org', 
    'http://kennethreitz.com' 
] 

rs = (grequests.get(u) for u in urls) 
grequests.map(rs) 
+1

私はこのメソッドを使って約50,000のURLにリクエストを送信したいと思います。それは良い戦略ですか?また、タイムアウトなどの例外はどうですか? – John

+0

@ジョンはい、そうです。例外については、['safe_mode'](http://requests.readthedocs.org/en/latest/api/)のパラメータを参照し、[953](https://github.com/kennethreitz/requests/pull/953)を発行してください。 –

+5

grequestを使用して30件を超えるリクエストを送信することはできません。私がするとき、私は "最大リトライはurlで超過しました:...、開いているファイルが多すぎます"。とにかくこの問題を解決するには? – AliBZ

1

マルチスレッドとパイプライン要求を使用する必要があります。例:search-> details-> save

使用できるスレッドの数は、あなたの機器にのみ依存しません。サービスが提供できるリクエスト数同時に実行できるリクエストの数はいくつですか?帯域幅でさえもボトルネックになる可能性があります。

何らかの制限があるとサービスがブロックされる可能性があるので、プロキシまたは複数のIPバインディングを使用する必要があります。

私の場合、ほとんどの場合、私は自分のラップトップでPythonスクリプトから50〜300件の同時リクエストを実行できます。

+0

ここではポルシャと同意します。たいていの場合、任意のサービスに対するHTTPリクエストを行うときに費やされる(クロック)時間のほとんどは、ネットワークとリモートサービスが応答するのを待つことにあります。理由のなかで、スレッドが多いほど、その時点でのスレッドの方が、待ち行列の中にあるスレッドのほうが良いでしょう。間違いなく、Polschaのサービス調整に関する注意に留意してください。 – parselmouth

+0

ありがとうございます - サービスは商用で、私たちはそれを支払っています。それは非常に速く、ボトルネックではありません。この場合、最良の選択肢は何でしょうか? – user1094786

+0

@ user1094786この場合、リクエストのパイプラインを構築し、各ステージのスレッド数を試してみてください。試してみてください。遅かれ早かれ上限が見つかるでしょう:-) –

0

Twistedの優れたアプリケーションのようなサウンドです。ここにいくつかのweb-related examplesが含まれています。方法はdownload a web pageです。ここに関連する質問はdatabase connections with Twistedです。

Twistedはではありません。は、一度に複数のことを行うスレッドに依存します。むしろ、それはcooperative multitaskingのアプローチをとる---メインスクリプトは原子炉を起動し、原子炉はあなたが設定した関数を呼び出します。原子炉を動作させるには、原子炉に制御を戻す必要があります。あなたはおそらく非同期IOないスレッドを使用したいよりも

関連する問題