【问题标题】:Download A Single File Using Multiple Threads使用多线程下载单个文件
【发布时间】:2012-03-14 12:08:46
【问题描述】:

我正在尝试为 Linux 创建一个“下载管理器”,让我可以使用多个线程下载一个文件。这就是我想要做的:

  1. 通过指定偏移量将要下载的文件分成不同的部分
  2. 将不同的部分下载到一个临时位置
  3. 将它们合并到一个文件中。

第 2 步和第 3 步是可以解决的,但我在第 1 步遇到了困难。下载文件时如何指定偏移量?

使用类似于open("/path/to/file", "wb").write(urllib2.urlopen(url).read()) 的内容不允许我指定读取的起点。有没有其他选择?

【问题讨论】:

  • 为什么要多线程下载?下载不会更快。
  • 你不能使用多个文件然后合并吗?您为远程文件的每个块保存一个临时目录中的文件,然后合并所有内容。
  • @JakubZaverka :通常是这样。如果您尝试使用wget 和像DownThemAll(对于Firefox)这样的下载管理器下载相同的文件,甚至尝试使用wget 使用this 进行多线程wget,您会看到差异。
  • @hurtledown : 我的问题是,我如何下载单个文件的不同部分

标签: python download urllib2 fedora


【解决方案1】:

要下载部分文件,只需像这样设置Range 标头

req = urllib2.Request(url)
req.headers['Range'] = 'bytes=%s-%s' % (start, end)
f = urllib2.urlopen(req)

虽然并非所有服务器都支持Range 标头。大多数文件共享服务都没有。

【讨论】:

    【解决方案2】:

    首先,http 服务器应该返回 Content-Length 标头。这通常表示文件是静态文件,如果是动态文件,比如php或者jsp的结果,就不能这样拆分。

    然后,您可以在请求时使用 http Range 标头,该标头告诉服务器应该返回文件的哪一部分。有关如何设置和解析 http 头的信息,请参见 python 文档。

    为此,如果部分大小为 100k,您首先请求 Range: 0-1000000 100k 将获得第一部分,并在其内容长度中告诉您文件的大小,然后启动一些不同的线程范围,它会工作

    【讨论】:

      【解决方案3】:

      请参阅http://docs.python.org/library/stdtypes.html#file-objects 中的 file.seek。

      这可能会奏效。

      出于兴趣,拆分文件的原因是什么?

      【讨论】:

      • 它是一个我需要访问的远程托管文件。我的系统上没有一个。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多