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

时间:2019-06-13 20:23:45

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

我正在尝试并行化python中成千上万的下载。每次下载需要2-3秒。我看过多线程与多处理,看来根据IO,多线程会更好。

我有一个url的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)

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

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

  

导入多处理

     

multiprocessing.cpu_count()

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

1 个答案:

答案 0 :(得分:2)

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

但是,为您找到解决方案的最快途径可能是运行一些简短的经验测试。每次运行将并行性扩展3倍或4倍;您可能会很快找到“最佳地点”。您可以尝试在proc /线程之间进行切换,但这不应该成为限制因素,它应该是与带宽相平衡的网络响应。