14

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

Pythonモジュールは非ブロッキングを要求しますか? ブロッキングまたは非ブロッキングに関するドキュメントには何も表示されません。

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

4

2 に答える 2

51

のようurllib2に、requestsブロックしています。

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

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

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

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

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

もちろん、本当に凝ったことをする必要がある場合は、、、、またはに行きたいと思うでしょうtwisted(またはstdlibの一部になるまで数か月待ちます)。tornadotuliptulip

于 2013-01-09T20:39:16.440 に答える
2

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

于 2013-01-09T20:48:51.927 に答える