用于并行下载多个文件的库或工具

Bjö*_*ist 20 python parallel-processing http download feed

我正在寻找一个python库或命令行工具,用于并行下载多个文件.我目前的解决方案是按顺序下载文件,这很慢.我知道你可以很容易地在python中编写一个半成熟的线程解决方案,但是在使用线程时我总是遇到烦人的问题.它用于从网站轮询大量xml提要.

我对解决方案的要求是:

  1. 应该是可以打断的.Ctrl + C应立即终止所有下载.
  2. 即使主程序崩溃或抛出异常,也不应该使用kill手动杀死剩余的进程.
  3. 它也适用于Linux和Windows.
  4. 它应该重试下载,对网络错误具有弹性并且应该正常超时.
  5. 应该明智的做法是不要同时下载100多个同一台服务器,但要以理智的方式对它们进行排队.
  6. 它应该处理重要的http状态代码,如301,302和304.这意味着对于每个文件,它应该将Last-Modified值作为输入,并且只有在自上次更改后才下载.
  7. 优选地,它应该具有进度条,或者应该容易为其编写进度条以监视所有文件的下载进度.
  8. 优选地,它应该利用http keep-alive来最大化传输速度.

不要建议我如何实施上述要求.我正在寻找一个现成的,经过实战考验的解决方案.

我想我应该描述我想要的东西......我有大约300种不同的数据源,因为xml格式的文件来自50个数据提供者.每个文件的大小在100kb到5mb之间.我需要经常轮询它们(如每隔几分钟一次)以确定它们是否有我需要处理的新数据.因此,下载程序使用http缓存来最小化要获取的数据量非常重要.它显然也使用gzip压缩.

那么最大的问题是如何在不超越任何边界的情况下以尽可能高效的方式使用带宽.例如,如果您打开20个同时连接到其数据源的连接,则一个数据提供商可能会认为它被滥用.相反,最好使用一个或两个重用于多个文件的连接.或者您自己的连接可能会以奇怪的方式受到限制.我的isp限制了您可以执行的dns查找次数,因此某种dns缓存会很好.

Pan*_*aj 8

你可以尝试pycurl,虽然界面起初并不容易,但是一旦看了例子,就不难理解了.我用它在微薄的linux盒子上并行获取1000个网页.

  1. 您不必处理线程,因此它会优雅地终止,并且不会留下任何进程
  2. 它提供超时和http状态处理选项.
  3. 它适用于Linux和Windows.

唯一的问题是它提供了一个基本的基础设施(基本上只是一个优秀的curl库上面的python层).您将不得不写几行来实现您想要的功能.


Aar*_*lla 7

有很多选择,但很难找到适合您所有需求的选项.

在您的情况下,尝试这种方法:

  1. 创建一个队列.
  2. 将URL下载到此队列(或"配置对象",其中包含URL和其他数据,如用户名,目标文件等).
  3. 创建一个线程池
  4. 每个线程都应该尝试从队列中获取URL(或配置对象)并对其进行处理.

使用另一个线程来收集结果(即另一个队列).当结果对象的数量= =第一个队列中的放置数量时,您就完成了.

确保所有通信都通过队列或"配置对象"进行.避免访问线程之间共享的数据结构.这可以为您节省99%的问题.

  • GaretJax:如果你看一下编辑历史,那么上面的答案是在提问者添加句子之前十分钟做出的. (3认同)