2010-11-18 6 views
0

私は大きなリモートファイルをダウンロードするために複数のスレッドを作成する必要があるプロジェクトに取り組んでいます。私はすでにこれを行っていますが、私は理解できませんが、単一のスレッドを使用するのに比べて、複数のスレッドでファイルをダウンロードするのに時間がかかります。 xampp localhostを使用して、経過時間テストを実行しました。私はそれが正常な動作かどうかを知りたいのですが、実際のサーバからダウンロードしようとしていないためです。Python/Urllib2/Threading:複数のダウンロードスレッドよりも速く単一のダウンロードスレッド。どうして?

おかげ ケネディ

+0

数字を入力してください。ダウンロードにはどれくらい時間がかかりますか? 2回の同時ダウンロードに2倍の時間がかかりますか? 3回は3回以上かかる?あなたは何について話していますか?あなたが見ている番号を入力してください。また、マルチスレッドコードの最小コードスニペットを提供してください。あなたが間違っている可能性はわずかです。 –

答えて

4

9人の女性は、1ヶ月で赤ちゃんを作るために組み合わせることはできません。スレッドが10個ある場合は、それぞれが単一のスレッドの帯域幅がわずか10%で、コンテキスト切り替えなどのオーバーヘッドが発生します。

+0

ありがとう。私は今それを得る – Kennedy

1

Pythonスレッドでは、GIL(Golbal Interpreter Lock)プログラムの実行時間。

ここで話をたくさんやってないと私は多分それはあなたの問題を理解するためにあなたを助けることができるthisthisを読むためにあなたを招待し、あなたはまた、2つの会議herehereを見ることができます。これはツイストは、データが今のソケットで使用できない場合は、多くのソケット接続を扱うことができるので、全体のスレッドをブロックしないことを意味し、非ブロックI/Oを使用しています:)

+2

GILはI/Oを待つ間に解放されるので、GILの奇妙さには当てはまりません。 – andreypopp

+0

@andreypopp:あなたは私の答えの中のリンクを見ましたか?私がマルチコアプロセスを使用している場合には、I/OバウンドプロセスもGILによって "影響を受けます"(intentionally) "影響を受けます私はGILとI/OバウンドとCPUバウンドプロセスについて私が知っていることをすべて説明することを望んでいませんでした。なぜならビデオ会議は私の貧しい知識や英語よりも優れていなければならないと教えたからです。リンク、彼らはOPケースについて話している。 – mouad

+0

ビデオをありがとう。非常に役に立ちました – Kennedy

1

助けることができる

・ホープ1つのスレッドで同時にI/Oを待っている。しかし、I/O(大量のデータを解析する)とは異なる処理を行う場合は、依然としてスレッドをブロックします。

stdlibのソケットモジュールを使用しているときにI/Oをブロックしている場合は、socket.readと呼ばれ、データが現時点では利用できない場合、スレッド全体がブロックされるため、同時ダウンロードを処理します。

  • 新しい接続(STDLIBからthreading + socket)のためのフォーク新しいスレッド:

    これらは、同時実行するには、2つの方法があります。

  • マルチプルI/Oとハンドルは、1つのスレッドで接続できます(Twisted)。
関連する問題