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