Concurrency Python:使用请求下载数千个压缩文件的最快(并行)方式

Concurrency Python:使用请求下载数千个压缩文件的最快(并行)方式,concurrency,python-requests,python-multiprocessing,python-multithreading,Concurrency,Python Requests,Python Multiprocessing,Python Multithreading,背景 对于我们的研究,我们目前需要下载约15000个文件。虽然数据库有它的命令行工具,以支持“批量”下载,但对于15.000次连续运行来说,这是完全不可行的(就像命令行工具目前所做的那样) 简单数学 我使用当前可用的命令行工具下载了几次运行,并计算了平均运行时间,即每个文件20分钟(如果不是更多的话)。因此,要对所有15000个文件执行此操作,这将需要15.000*20/60/24=208天,只有在脚本运行时每小时支付一个小时才好;) 批量命令行脚本 这是允许用户下载批量数据(不是我制作的)的脚

背景
对于我们的研究,我们目前需要下载约15000个文件。虽然数据库有它的命令行工具,以支持“批量”下载,但对于15.000次连续运行来说,这是完全不可行的(就像命令行工具目前所做的那样)

简单数学
我使用当前可用的命令行工具下载了几次运行,并计算了平均运行时间,即每个文件20分钟(如果不是更多的话)。因此,要对所有15000个文件执行此操作,这将需要
15.000*20/60/24=
208天
,只有在脚本运行时每小时支付一个小时才好;)

批量命令行脚本
这是允许用户下载批量数据(不是我制作的)的脚本:

注意:
我对它做了一点修改,所以我可以直接从IDE运行它(这样就不必为每一个小的修改启动命令行)

我在想什么
我有(一点)处理多线程/多处理/异步请求的经验,但不知道在这种情况下应该怎么做。我的Linux服务器上有20个CPU,所以我可以做一些MP(
~208/20=
10+
天),但根据我以前的经验,CPU的使用率只有~1-5%,这似乎是在浪费容量。对于这类问题,我没有使用其他两种方法,我将这两种方法都用于简单的http请求(只是请求一个页面并获得结果,而不是分块下载文件)


真正的问题 下载所有这些15000个文件的最快方法是什么(按顺序下载绝对不是一个选项)

如果不太费时,请提供一个代码示例(或参考)来说明您的意思


更新
我曾经在运行脚本、下载1个文件时测量数据流-带宽使用情况(当然有后台进程,但这些似乎可以忽略不计,只有几Mb)。我在4个时间点进行了此操作,并对数字进行了平均:

Curr: 110    Mbit/s
Min:   30    Mbit/s
Avg:   90    Mbit/s
Max:  159.75 Mbit/s
Ttl:  752.41 GByte


使用Python的要求有多严格?您可能会使用wget/xargs-P,甚至可以使用wget/xargs-P。可能的重复项:我认为这是一个重复项,但分块下载压缩文件肯定不同于仅请求页面(正如我在问题中已经解释的)@mahdise您只是从某个服务器下载数据,您将受到I/O限制,而不是CPU限制。因为一个文件需要20分钟,所以这些文件必须相当大。当您进行其中一次传输时,是否会最大限度地利用网络带宽?如果是这样的话,添加更多的线程将不会有太大帮助。只需生成线程或进程,并在它们之间分发实际的CSV文件即可。关于多重处理以及如何拥有多个辅助进程,这里有很多答案。或线程。
Curr: 110    Mbit/s
Min:   30    Mbit/s
Avg:   90    Mbit/s
Max:  159.75 Mbit/s
Ttl:  752.41 GByte