2009-07-20 5 views
0

私は一度に複数のWebサイトからデータをダウンロードするtkinter GUIを持っています。私はダウンロードごとに別々のスレッドを実行します(約28)。 1つのGUIプロセスにはあまりにも多くのスレッドがありますか?それは本当に遅いので、個々のページには約1〜2秒かかりますが、すべてを一度に実行すると40秒以上かかります。すべてのページをダウンロードするのにかかる時間を短縮する方法はありますか?どんな助けでも感謝しています。Pythonは一度に複数のWebページにアクセスします

答えて

2

おそらくGIL(グローバルインタプリタロック)があなたのやり方になっているでしょう。 Pythonには多くのスレッドでいくつかのパフォーマンス上の問題があります。

twisted.web.getPageを試すことができます(http://twistedmatrix.com/projects/core/documentation/howto/async.htmlを参照してください)。 ベンチマークはありません。 しかし、そのページの例を取っ​​て28の延期を追加すると、それがどれほど速いかを見るとかなり速い結果が得られます。 gtkリアクトルを使用して、ツイストプログラミングスタイルにする必要があることに注意してください。

+0

私はそれを疑っています。それが、TCPソケットがバッファされている理由です。私はそれに好奇心から試してみなければならないでしょうが、ソケットバッファリングが大部分のためにこれを処理することを期待しています。 –

+0

私はそのページを読んで、それは非常に役に立つと思う、私は何かを見つけることができない場合、ツイストを使用しようとする可能性があります、ありがとう。 –

+0

ねじれ推奨のUpvote。同等のスレッドコードよりもねじれを使用するコードを作成してデバッグするのははるかに簡単です。 – habnabit

0

スレッドの代わりにプロセスを使用できます。 PythonにはGILがあり、状況によっては遅延が発生する可能性があります。

1

プロセスには、現代のOSに問題のない何百ものスレッドが存在する可能性があります。

帯域幅が制限されている場合は、1〜2秒の28倍は約40秒が正しいことを意味します。あなたは待ち時間が限られている場合、それはより速くなるはずですが、情報なしで、私が提案することができるすべては、次のとおりです。

  • は、それが実際に並列で実行していることを確認するために、コードへのロギングを追加し、あなたが誤っていないだということ何らかの形でスレッドをシリアライズします。
  • ネットワークモニタを使用して、ネットワーク要求が実際にパラレルに出力されていることを確認します。

さらに詳しい情報がないと、何か改善するのは難しいです。

+0

私はチェックして、スレッドはすべて同時に起動して並列に実行しますが、それらはすべて異なる時間にurllibリクエストから戻ってきます。私はそれがネットワークと関係していて、一度に複数の要求を処理するものと仮定しています。あなたはそれが問題だと思いますか、それとも何か他のものですか?一度に複数のネットワーク要求を実行できますか?私はWindows XP上で、私はそれが役立つ場合は、ワイヤレス接続があります。あなたの助けに感謝し、私の無知を言い訳します。私はネットワークの人ではありません。 –

関連する問題