おそらく、サーバーのアップロード パイプ (接続が速い場合) またはダウンロード パイプ (接続が遅い場合) のいずれかに拘束されることになります。
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 の方が適している可能性があります。