5

最近、オンライン マンガ Web サイトからマンガをダウンロードできるプログラムに取り組んでいます。動作はしますが、少し遅いです。そのため、ダウンロードを高速化するためにマルチスレッド/処理を使用することにしました。ここに私の質問があります。

  1. どちらが優れていますか? (これは python3 プログラムです)

  2. マルチプロセッシングは間違いなく機能すると思います。マルチプロセッシングを使用する場合、適切なプロセス数はどれくらいですか?CPU のコア数と関係がありますか?

  3. マルチスレッドはおそらくうまくいくでしょう。
    David M.Beazley 著の《<a href="http://www.dabeaz.com/python/NewGIL.pdf" rel="nofollow">Inside the New GIL》を読みました。マルチスレッドを使用しますか?

4

3 に答える 3

4

おそらく、サーバーのアップロード パイプ (接続が速い場合) またはダウンロード パイプ (接続が遅い場合) のいずれかに拘束されることになります。

TCP 接続に関連するかなりの起動待ち時間があります。これを回避するために、HTTP サーバーは複数のリソースを要求するために接続をリサイクルできます。したがって、クライアントがこのレイテンシーの影響を回避するには、次の 2 つの方法があります。

(a) 単一の TCP 接続を介して複数のリソースをダウンロードして、最初のファイルをダウンロードするときに、プログラムが 1 回だけレイテンシーを受けるようにします。

(b) TCP 接続ごとに 1 つのリソースをダウンロードし、複数の接続を使用して、すべての時点で少なくとも 1 つが全速力でダウンロードされるようにします。

オプション (a) では、使用している HTTP ライブラリが何であれ、リクエストをリサイクルする方法を調べる必要があります。優れたものには、接続をリサイクルする方法があります。 http://python-requests.org/は優れた Python HTTP ライブラリです。

オプション (b) の場合、おそらくマルチスレッド/マルチプロセス ルートが必要です。同時スレッド数は 2 ~ 3 にとどめることをお勧めします。それ以上にすると、接続間で帯域幅が共有される可能性が高くなり、複数のダウンロードが禁止されるリスクが高まるからです。

コードはほとんど処理を行わず、ほとんどの時間をネットワーク経由でバイトが到着するのを待つことに費やすため、このユース ケースでは GIL はあまり重要ではありません。

これを行う怠惰な方法は、Python を完全に避けることです。ほとんどの UNIX ライクな環境には、これに適したビルディング ブロックがあるからです。(Windows を使用している場合、このアプローチの最良の選択は、msys、cygwin、または Linux のいくつかのフレーバーを実行する VirtualBox です。個人的には Linux Mint が好きです。) ダウンロードしたい URL のリストがある場合は、1 つずつ行、テキストファイルで、これを試してください:

cat myfile.txt | xargs -n 1 --max-procs 3 --verbose wget

これらのパラメーターを指定した「xargs」コマンドは、stdin の空白で区切られた URL (この場合は myfile.txt から取得) を取得し、それぞれに対して「wget」を実行します。一度に最大 3 つの「wget」サブプロセスを実行できます。そのうちの 1 つが完了する (またはエラーが発生する) と、別の行を読み取り、すべての入力 URL が使い果たされるまで、別のサブプロセスを起動します。クッキーやその他の複雑なものが必要な場合は、wget よりも curl の方が適している可能性があります。

于 2013-03-15T09:08:59.470 に答える
1

それは本当に問題ではありません。IO を待機しているスレッドが実行中の他のスレッドの邪魔にならないことは確かです。また、インターネット経由でのダウンロードは IO バウンドのタスクであるため、実行スレッドを複数の CPU に分散させようとする本当の理由はありません。それと、スレッドがプロセスよりも軽量であるという事実を考えると、スレッドを使用する方が良いかもしれませんが、正直なところ、違いに気付くことはありません。

使用するスレッドの数は、ウェブサイトにどれだけ強くアクセスしたいかによって異なります。礼儀正しく、スクレイピングが DOS 攻撃と見なされないように注意してください。

于 2013-03-12T02:27:21.303 に答える
0

この種のタスクにはマルチスレッドは本当に必要ありません.. Twistedのようなものを使用してシングルスレッド非同期プログラミングを試すことができます

于 2013-03-12T02:32:05.017 に答える