2017-10-25 2 views
0

複数のHTTPリクエストを同時に送信したいです。私はこれを行うにはPythonのmultiprocessing.dummy.Poolを使用しています。スレッドプールを作成するコードは次のとおりです。HTTPリクエストごとに1つのワーカースレッドを使用する必要があります

p = Pool(len(users)) 

len(users))は単純にリクエスト数です。

ご覧のとおり、リクエストごとにスレッドを作成しています。これは悪い考えですか?代わりにlen(users))スレッドの一部を作成する必要がありますか?

+0

現在の方法で問題が発生していますか? – wwii

+0

重複していませんが、スレッド数/プロセス/接続数*を選択する根拠はありませんが、好きかもしれません。https://stackoverflow.com/q/2632520/2823755 – wwii

答えて

1

私は個人的にmultiprocessing.cpu_count()の倍数に基づいてサイジングを提案したいと思います。これはのアプローチで、5 * multiprocessing.cpu_count()という理論ではスレッド処理が多くブロックされているので、コアより多くのスレッドを必要とします。あなたが巨大なインターネットパイプを持っているなら、より高い倍数が理にかなっているかもしれません。必要に応じてmin(len(users), 5 * multiprocess.cpu_count())に制限することができます(スレッドを飽和させるタスクがない場合にスレッドをあまりにも多く割り当てることを避ける)。

多くのシステムでかなり低い値で発生する可能性があるスレッドとオープンハンドルには制限があり、すべてを一度に処理しようとするとスレッドを使用できない場合があります10,000以上のリクエストについて話すあなたのインターネット接続がある点を越えて並列処理の恩恵を受けることができないとすれば、より多くのスレッドを持つリソースを無駄にしているだけです。

+0

私は使用すると思います実際にはスレッドとは異なるアプローチです。 Pythonにはasyncioというものがあります。私はこれがLinuxのselect関数のようだと思いますか?あなたはノンブロッキングのリクエストを送信し、それらのいずれかが完了するのを待つという考えがありますか? – JRG

+0

@JRG:一種。 Pythonには直接インターフェイスの 'select'(そして現代のPythonの'セレクタ ')モジュールがありますが、非同期機能は同様のことを行うことができます(多くの場合、プログラムデザイン全体をハイジャックする傾向があります)。 – ShadowRanger

関連する問題