在Python中并行下载,并发下载的最佳数量是多少,使用哪种方法?

Parallelizing downloads in Python, what is the optimal number of concurrent downloads, and which method to use?

我正在尝试在 python 中并行处理数千个下载。每次下载需要 2-3 秒。我看过多线程与多处理,根据 IO,多线程似乎更好。

我有一个 python 网址列表,我使用此功能下载所有网址。

for k in range(0, 90000):
            id_sep = urls[k].rpartition('/')
            path = 'DownloadFolder/' + id_sep[2] + '.pdf'
            if not os.path.exists(path): 
                urllib.request.urlretrieve(arxiv_PDF_IDs[k], path)

我想知道 运行 并行下载的最佳方法是什么。

另一个考虑因素是并发下载的最佳数量是多少。跟核心数有关系吗?根据这个命令我的系统有两个

import multiprocessing

multiprocessing.cpu_count()

我有两个核心。这是否意味着同时下载的最佳数量是两个?如果是这样,我如何一次只进行两次下载,并对其余的迭代进行排队?

下载不是 compute-bound 过程;核心数量不太可能推动您的并行性。相反,这将取决于您的网络带宽(或您的份额)。我们没有您的网络配置和物理特征,因此我们无法预测。

但是,为您找到解决方案的最快途径可能是 运行进行一些简短的经验测试。在每个 运行 上将并行度提高 3 倍或 4 倍;您可能会很快找到 "sweet spot"。您可以尝试在 proc/thread 之间切换,但这不应该是限制因素——它应该是与该带宽平衡的网络响应。