Python分片多进程下载文件
源码链接#
个人博客地址#
具体实现#
import math
from concurrent.futures import ProcessPoolExecutor
import requests
# 设置超时时间为30s
# socket.setdefaulttimeout(30)
# 默认每个片最小2MB
DEFAULT_MIN_PART = 2048 * 1024
# 每个组分配下载量大小
GROUP_PART = 0
# 最大进程<=10
MAX_THREAD = 10
def make_file_buff(name, length):
"""
生成整个文件大小的空文件
:param name: 文件名
:param length: 总字节数
"""
with open(name, 'wb') as f:
f.seek(length - 1)
f.write(b'\x00')
def write_part(name, index, part):
"""
写入片
:param name: 文件名
:param index: 第几个片
:param part: 二进制片
"""
with open(name, 'rb+') as f:
f.seek(index * GROUP_PART + DEFAULT_MIN_PART)
f.write(part)
def down_part(url, name, index):
"""
下载片
:param url: url链接
:param name: 文件名
:param index: 下载第几个片
:return: 片的索引
"""
while True:
try:
write_part(name, index, requests.get(url, headers={'Range': 'bytes=%d-%d' % (
index * GROUP_PART + DEFAULT_MIN_PART, (index + 1) * GROUP_PART + DEFAULT_MIN_PART)}).content)
return index
except Exception as e:
print(e)
if __name__ == '__main__':
url = 'https://download.dbeaver.com/community/21.2.2/dbeaver-ce_21.2.2_amd64.deb'
# 解析文件名
file_name = url[url.rindex('/') + 1:]
# 默认下载2M的开头
res = requests.get(url, headers={'Range': 'bytes=0-%d' % DEFAULT_MIN_PART})
# 根据返回的头信息解析总长度
content_length = res.headers['Content-Range']
# 总长度
size = int(content_length[content_length.index('/') + 1:])
# 创建空白文件
make_file_buff(file_name, size)
with open(file_name, 'rb+') as f:
f.write(res.content)
# 如果总长度小于最小片,则已经下载完成
if size <= DEFAULT_MIN_PART:
exit(0)
# 以最小片计算所需线程数
workers = math.ceil(size / DEFAULT_MIN_PART) - 1
# 大于10则限定在10以内
if workers >= 10:
GROUP_PART = math.ceil((size - DEFAULT_MIN_PART) / 10)
else:
GROUP_PART = math.ceil((size - DEFAULT_MIN_PART) / DEFAULT_MIN_PART)
# 最终实际线程数
workers = math.ceil((size - DEFAULT_MIN_PART) / GROUP_PART)
# 最多10个进程同时下载
processPool = ProcessPoolExecutor(max_workers=MAX_THREAD)
futures = {}
for i in range(0, workers):
# 提交进程下载
job = processPool.submit(down_part, url, file_name, i)
futures[job] = i
for job in futures:
re = job.result()
if re != -1:
print('片{0}下载结束'.format(re))
作者:Esofar
出处:https://www.cnblogs.com/WindSnowLi/p/16998187.html
版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 【杂谈】分布式事务——高大上的无用知识?