web-dev-qa-db-ja.com

Python非ブロッキングを要求しますか?

重複の可能性:
Pythonリクエスト の非同期リクエスト

python module Requests non-blocking?私はブロックまたは非ブロックに関するドキュメントに何も表示されません。

ブロッキングしている場合、どのモジュールを提案しますか?

11
Jeff

お気に入り urllib2requestsがブロックしています。

ただし、別のライブラリを使用することもお勧めしません。

最も簡単な答えは、各リクエストを別々のスレッドで実行することです。あなたがそれらを何百も持っていない限り、これは問題ないはずです。 (数百が多すぎるかどうかは、プラットフォームによって異なります。Windowsの場合、制限はおそらくスレッドスタック用のメモリ量です。他のほとんどのプラットフォームでは、カットオフが早くなります。)

doが数百ある場合は、それらをスレッドプールに入れることができます。 ThreadPoolExecutor Example in concurrent.futuresページはほぼ正確に必要なものです。 urllib呼び出しをrequests呼び出しに変更するだけです。 (2.xを使用している場合は、PyPIの同じパッケージのバックポートである futures を使用します。)欠点は、実際には1000件すべてのリクエストを開始しないことです。一度、最初の、たとえば8。

数百があり、それらすべてを並列にする必要がある場合、これは gevent の仕事のように聞こえます。すべてをモンキーパッチしてから、スレッドで作成するのとまったく同じコードを作成しますが、greenletsではなくThreadsを生成します。

grequests は、requestsの古い非同期サポートから直接進化したもので、gevent + requestsラッピングを効果的に実行します。そして、最も単純なケースでは、それは素晴らしいことです。しかし、重要なことなら、明示的なgeventコードを読む方が簡単だと思います。あなたのマイレージは異なる場合があります。

もちろん、何か本当に派手なことをする必要がある場合は、おそらくtwistedtornado、またはtulip(またはtulipがstdlibの一部になるまで数か月待ちます)。

44
abarnert

それはブロックされていますが、これは私が知っている一種のきちんとした小さなラッパーを思い出させました。 dictまたはlistのいずれかに似たデータ構造に関数を追加できます。関数が追加されるとすぐにバックグラウンドで実行され、実行が完了するとすぐに関数から返された値を関数の代わりに使用できるようになります。 。 ここ です。

1
Adam