一度に複数の Web サイトからデータをダウンロードする tkinter GUI があります。ダウンロードごとに個別のスレッドを実行します (約 28)。1 つの GUI プロセスに対してスレッドが多すぎますか? 非常に遅いため、個々のページには約 1 ~ 2 秒かかりますが、すべてを一度に実行すると 40 秒以上かかります。すべてのページをダウンロードするのにかかる時間を短縮する方法はありますか? どんな助けでも大歓迎です、ありがとう。
3 に答える
邪魔をするのはおそらく GIL (グローバル インタープリター ロック) です。Python には、多くのスレッドでいくつかのパフォーマンス上の問題があります。
twisted.web.getPage を試すことができます (ページの少し下にあるhttp://twistedmatrix.com/projects/core/documentation/howto/async.htmlを参照)。そのためのベンチマークはありません。しかし、そのページの例を取り上げて、28 個の deferred を追加して、それがどれほど速いかを確認すると、同等の結果がかなり速く得られます。ただし、gtk リアクターを使用して、ねじれたプログラミング スタイルに入る必要があることに注意してください。
プロセスは、最新の OS で問題なく数百のスレッドを持つことができます。
帯域幅が限られている場合、1 ~ 2 秒 x 28 は、40 秒が適切であることを意味します。レイテンシが制限されている場合は、より高速になるはずですが、情報がない場合、私が提案できるのは次のとおりです。
- コードにロギングを追加して、コードが実際に並行して実行されていることを確認し、誤ってスレッドをシリアル化していないことを確認します。
- ネットワーク モニタを使用して、ネットワーク リクエストが実際に並行して送信されていることを確認します。
より多くの情報がなければ、より良いものを提供することは困難です。
スレッドの代わりにプロセスを使用してみることができます。Python には GIL があり、状況によっては遅延が発生する可能性があります。