重複の可能性:
Pythonリクエスト の非同期リクエスト
python module Requests non-blocking?私はブロックまたは非ブロックに関するドキュメントに何も表示されません。
ブロッキングしている場合、どのモジュールを提案しますか?
お気に入り urllib2
、requests
がブロックしています。
ただし、別のライブラリを使用することもお勧めしません。
最も簡単な答えは、各リクエストを別々のスレッドで実行することです。あなたがそれらを何百も持っていない限り、これは問題ないはずです。 (数百が多すぎるかどうかは、プラットフォームによって異なります。Windowsの場合、制限はおそらくスレッドスタック用のメモリ量です。他のほとんどのプラットフォームでは、カットオフが早くなります。)
doが数百ある場合は、それらをスレッドプールに入れることができます。 ThreadPoolExecutor
Example in concurrent.futures
ページはほぼ正確に必要なものです。 urllib
呼び出しをrequests
呼び出しに変更するだけです。 (2.xを使用している場合は、PyPIの同じパッケージのバックポートである futures
を使用します。)欠点は、実際には1000件すべてのリクエストを開始しないことです。一度、最初の、たとえば8。
数百があり、それらすべてを並列にする必要がある場合、これは gevent
の仕事のように聞こえます。すべてをモンキーパッチしてから、スレッドで作成するのとまったく同じコードを作成しますが、greenlet
sではなくThread
sを生成します。
grequests
は、requests
の古い非同期サポートから直接進化したもので、gevent
+ requests
ラッピングを効果的に実行します。そして、最も単純なケースでは、それは素晴らしいことです。しかし、重要なことなら、明示的なgevent
コードを読む方が簡単だと思います。あなたのマイレージは異なる場合があります。
もちろん、何か本当に派手なことをする必要がある場合は、おそらくtwisted
、tornado
、またはtulip
(またはtulip
がstdlibの一部になるまで数か月待ちます)。
それはブロックされていますが、これは私が知っている一種のきちんとした小さなラッパーを思い出させました。 dictまたはlistのいずれかに似たデータ構造に関数を追加できます。関数が追加されるとすぐにバックグラウンドで実行され、実行が完了するとすぐに関数から返された値を関数の代わりに使用できるようになります。 。 ここ です。