我有一个使用案例,需要使用多个线程来下载一个大的远程文件。每个线程必须同时运行(并行),抓取文件的特定部分。期望在成功下载所有部分后,将这些部分合并成一个(原始)文件。
也许使用requests库可以完成这项工作,但我不确定如何将其多线程化到一个将块组合在一起的解决方案中。
url = 'https://url.com/file.iso'
headers = {"Range": "bytes=0-1000000"} # first megabyte
r = get(url, headers=headers)
我也在考虑使用curl,由Python来组织下载,但我不确定这是不是正确的方法。它看起来太复杂了,偏离了普通的Python解决方案。类似于:
curl --range 200000000-399999999 -o file.iso.part2
有没有人能解释一下你是如何做这样的事情的?或者发布一个在Python 3中工作的代码示例?我通常很容易找到与Python相关的答案,但是这个问题的解决方案似乎让我很困惑。
4条答案
按热度按时间mfuanj7w1#
这是一个使用Python 3和Asyncio的版本,这只是一个例子,它可以改进,但你应该能够得到你需要的一切。
get_size
:发送HEAD请求以获取文件的大小download_range
:下载单个块download
:下载所有块并合并它们vngu2lb82#
您可以使用grequests进行并行下载。
PS:我没有检查范围是否正确确定,以及下载的md5 sum是否匹配!这应该只是显示了它的一般工作原理。
au9on6nz3#
我发现最好的方法是使用一个名为pySmartDL的模块。
步骤1:
pip install pySmartDL
步骤2:下载文件时,您可以使用
注:默认情况下,这会提供一个下载计数器。
如果您需要将下载进度挂钩到一个gui,您可以使用
如果您想使用更多线程,可以使用
您可以在项目页面中找到更多功能
下载次数:http://pypi.python.org/pypi/pySmartDL/
文件:http://itaybb.github.io/pySmartDL/
项目页面:https://github.com/iTaybb/pySmartDL/
错误和问题:https://github.com/iTaybb/pySmartDL/issues
zengzsys4#
您也可以从
concurrent.futures
使用ThreadPoolExecutor
(或ProcessPoolExecutor
),而不使用asyncio
。以下显示如何使用ThreadPoolExecutor
修改bug's answer:**额外的好处:**以下代码片段 * 还 * 使用
tqdm
来显示下载进度条。如果你不想使用tqdm
,只需注解掉with tqdm(total=file_size . . .
下面的代码块。关于tqdm
的更多信息是here,它可以与pip install tqdm
一起安装。顺便说一句,tqdm
也可以与asyncio
一起使用。