【问题标题】:Parallelizing downloads in Python, what is the optimal number of concurrent downloads, and which method to use?在 Python 中并行下载,并发下载的最佳数量是多少,使用哪种方法?
【发布时间】:2019-06-13 20:23:45
【问题描述】:

我正在尝试在 python 中并行化数千次下载。每次下载需要 2-3 秒。我研究了多线程与多处理,似乎多线程对于 IO 来说会更好。

我有一个 python 的 url 列表,我使用这个函数来下载它们。

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)

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

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

导入多处理

multiprocessing.cpu_count()

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

【问题讨论】:

  • 所以对于 IO 绑定操作,您可能不太关心您有多少内核,您可以尝试分析并查看什么可以为您提供最饱和的带宽而不会出现错误...
  • 几个快速的想法:可能想看看使用requests 包,它以更简单的格式支持这种事情。您可能还想查看this blogpost 使用请求和多线程下载。然后我建议对数据集进行分析,因为您的结果将取决于许多因素。

标签: python python-multiprocessing python-asyncio python-multithreading


【解决方案1】:

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

但是,对您而言,最快的解决方案可能是运行一些简短的经验测试。每次运行时将并行度扩大 3 倍或 4 倍;您可能会很快找到“最佳位置”。您可以尝试在 proc/thread 之间切换,但这不应该是限制因素 - 它应该是与该带宽平衡的网络响应。

【讨论】:

    猜你喜欢
    • 2013-01-18
    • 2021-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多