您可能会受到服务器的上传管道(如果您的连接速度较快)或下载管道(如果您的连接速度较慢)的约束。
与 TCP 连接相关的启动延迟很长。为了避免这种情况,HTTP 服务器可以回收连接以请求多个资源。因此,您的客户有两种方法可以避免这种延迟影响:
(a) 通过单个 TCP 连接下载多个资源,因此您的程序在下载第一个文件时只遭受一次延迟
(b) 每个 TCP 连接下载一个资源,并使用多个连接,以便希望在每个时间点,至少有一个将全速下载
使用选项 (a),您想了解如何使用您正在使用的任何 HTTP 库来回收请求。任何好的人都会有一种方法来回收连接。 http://python-requests.org/是一个很好的 Python HTTP 库。
对于选项 (b),您可能确实需要多线程/多进程路由。我建议只同时使用 2-3 个线程,因为再多的线程可能只会导致连接之间共享带宽,并增加因多次下载而被禁止的风险。
GIL 对于这个用例并不重要,因为您的代码几乎不会进行任何处理,大部分时间都在等待字节通过网络到达。
The lazy way to do this is to avoid Python entirely because most UNIX-like environments have good building blocks for this. (If you're on Windows, your best choices for this approach would be msys, cygwin, or a VirtualBox running some flavor of Linux, I personally like Linux Mint.) If you have a list of URL's you want to download, one per line, in a text file, try this:
cat myfile.txt | xargs -n 1 --max-procs 3 --verbose wget
The "xargs" command with these parameters will take a whitespace-delimited URL's on stdin (in this case coming from myfile.txt) and run "wget" on each of them. It will allow up to 3 "wget" subprocesses to run at a time, when one of them completes (or errors out), it will read another line and launch another subprocess, until all the input URL's are exhausted. If you need cookies or other complicated stuff, curl might be a better choice than wget.