Python 使用多个线程下载单个文件

Python 使用多个线程下载单个文件,python,download,urllib2,fedora,Python,Download,Urllib2,Fedora,我正在尝试为Linux创建一个“下载管理器”,它允许我使用多个线程下载一个文件。这就是我想做的: 通过指定偏移量将要下载的文件分成不同的部分 将不同部分下载到临时位置 将它们合并到一个文件中 第2步和第3步是可以解决的,而在第#1步我就被卡住了。下载文件时如何指定偏移量 使用类似于open(“/path/to/file”,“wb”).write(urllib2.urlopen(url.read())的内容,不允许我指定读取的起点。是否有其他选择?请参阅中的file.seek 这可能会奏效 出于兴

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

  • 通过指定偏移量将要下载的文件分成不同的部分
  • 将不同部分下载到临时位置
  • 将它们合并到一个文件中
  • 第2步和第3步是可以解决的,而在第#1步我就被卡住了。下载文件时如何指定偏移量

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

    请参阅中的file.seek

    这可能会奏效


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

    要下载部分文件,只需如下设置
    范围

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

    但并非所有服务器都支持
    范围
    标题。大多数文件共享服务都不会。首先,http服务器应该返回内容长度头。这通常意味着该文件是一个静态文件,如果它是一个动态文件,例如php或jsp的结果,则不能进行这样的拆分

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


    为此,如果部件大小为100k,您首先请求范围:0-1000000 100k将获得第一个部件,并在其相应的长度中告诉您文件的大小,然后启动不同范围的线程,它将起作用

    为什么要使用多个线程下载?下载不会更快。你不能使用多个文件并在之后合并吗?您在临时目录中为远程文件的每个块保存一个文件,然后合并所有内容。@JakubZaverka:通常是这样。如果您尝试使用
    wget
    和类似
    DownThemAll
    (对于Firefox)的下载管理器下载同一个文件,或者甚至尝试使用多线程
    wget
    ,您可以看到不同之处。@Hurledown:我的问题是,如何下载单个文件的不同部分?这里有答案:我需要访问一个远程托管的文件。我的系统上没有。