1、需求

有多个文件的下载链接,使用多进程或者多线程快速下载文件,落盘到本地,同时显示固件的下载进度。

2、两种方案对比

2.1、多线程 + GET + tqdm进度条

import requests,os
import threading
import random
import time
from tqdm import tqdm
from concurrent.futures import ThreadPoolExecutor, Future, as_completed, wait
from multiprocessing import cpu_counturls= ["https://bigota.d.miui.com/9.8.29/miui_MI5SPlus_9.8.29_339fb2abdc_8.0.zip","https://bigota.d.miui.com/V12.0.2.0.PDCCNXM/miui_MI6X_V12.0.2.0.PDCCNXM_7c0078f6ae_9.0.zip","https://download.pro.sony/21/03/aPaWpHqoiM/sony_pjupdate_2015_5003_pjs_auth.zip"
]def download_file(url):print("------", "Start download with urllib")name = url.split("/")[-1]resp = requests.get(url, stream=True)content_size = int(resp.headers['Content-Length']) / 1024  # 确定整个安装包的大小path = os.path.join(os.getcwd(), name)print("File path:%s, content_size:%s" %(path, content_size))with open(path, "wb") as file:print("\rFile %s, total size is: %s" % (name, content_size))for data in tqdm(iterable=resp.iter_content(1024), total=content_size, unit='k', desc=name):file.write(data)print("%s download ok" % name)def test_tqdm():executor = ThreadPoolExecutor(max_workers=cpu_count()) # 线程池设置,最多同时跑8个线程for url in urls:args = [url,]tasks = [executor.submit(lambda p:download_file(*p), args)]wait(tasks)test_tqdm()

展现形式: 

2.2、多线程 + urlretrieve + 普通进度条

import requests,os
import threading
import random
import time
from tqdm import tqdm
from concurrent.futures import ThreadPoolExecutor, Future, as_completed, wait
from multiprocessing import cpu_count
from urllib import requesturls= ["https://bigota.d.miui.com/9.8.29/miui_MI5SPlus_9.8.29_339fb2abdc_8.0.zip","https://bigota.d.miui.com/V12.0.2.0.PDCCNXM/miui_MI6X_V12.0.2.0.PDCCNXM_7c0078f6ae_9.0.zip","https://download.pro.sony/21/03/aPaWpHqoiM/sony_pjupdate_2015_5003_pjs_auth.zip"
]def cbk(a, b, c):"""func:回调函数params:a:已经下载的数据块b:数据块的大小c:远程文件的大小"""start = time.perf_counter()per = 100.0*a*b/cif per>100:per=100dur = time.perf_counter() - startprint('\r'+'[下载进度]:%s%.2f%%[%.2fs]' % ('>'*int(a*b*50/c), float(per), dur), end='')if per == 100:  # 解决end=''引发的不换行print()def download(url):file_name = url.split("/")[-1]request.urlretrieve(url, file_name, cbk)def test_urlretrieve():executor = ThreadPoolExecutor(max_workers=cpu_count()) # 线程池设置,最多同时跑8个线程for url in urls:args = [url,]tasks = [executor.submit(lambda p:download(*p), args)]wait(tasks)test_urlretrieve()
展现形式:
  
三个下载文件的进度条初始在一行z打印,后面自动分开。 

同时下载多个文件,同时展示多个文件的下载进度相关推荐

  1. springboot文件上传下载实战 —— 登录功能、展示所有文件

    springboot文件上传下载实战 创建项目 pom.xml 数据库建表与环境准备 建表SQL 配置文件 application.properties 整体架构 前端页面 登录页面 login.ht ...

  2. [转]文件传输协议(FTP)操作(上传,下载,新建,删除,FTP间传送文件等)实现汇总1

    转自:http://blog.csdn.net/soarheaven/archive/2008/12/08/3474152.aspx 最近项目需要对FTP服务器进行操作,现把实现总结如下: 打算分2篇 ...

  3. 【Flutter】Icons 组件 ( FlutterIcon 下载图标 | 自定义 svg 图标生成 ttf 字体文件 | 使用下载的 ttf 图标文件 )

    文章目录 一.FlutterIcon 下载图标 二.自定义 svg 图标生成 ttf 字体文件 三.使用下载的 ttf 图标文件 四.完整代码示例 五.相关资源 一.FlutterIcon 下载图标 ...

  4. servlet实现文件上传,预览,下载和删除

    一.准备工作 1.1 文件上传插件:uploadify: 1.2 文件上传所需jar包:commons-fileupload-1.3.1.jar和commons-io-2.2.jar 1.3 将数据转 ...

  5. java 上传文件及预览_SpringBoot上传下载文件及在线预览

    SpringBoot上传下载文件及在线预览 今天大概就说说如何使用SpringBoot进行上传和下载以及在线预览文件 本篇主要介绍上传下载的功能,对于界面就简单一点,大致如下: 一.老规矩还是先看看小 ...

  6. php将图片导入,php中图片文件的导入,上传与下载

    ---------------------------------------------图片的导入-------------------------------------------------- ...

  7. Microsoft .NET Framework 2.0对文件传输协议(FTP)操作(上传,下载,新建,删除,FTP间传送文件等)实现汇总1...

    相关文章导航 Sql Server2005 Transact-SQL 新兵器学习总结之-总结 Flex,Fms3相关文章索引 FlexAir开源版-全球免费多人视频聊天室,免费网络远程多人视频会议系统 ...

  8. java中Excel导入,下载模板,附带前端展示

    java中Excel导入,下载模板,附带前端展示 后台下载模板代码 /*** 多个模板下载*/@RequestMapping(value = "/downloadExcel", m ...

  9. echarts实现河南各省市区县地图(河南省各省市区县地图json文件可以在我博客里下载)

    前言:最近公司项目有个需求,展示河南省各省市区县的地图,并展示相应的数据,看了些资料决定用echarts实现. 一.完成之后的效果图 点击市的模块显示对应的市,并显示对应市的数据 点击区县的模块显示对 ...

  10. 移动端利用OpenGL展示3D模型文件STL

    移动端利用OpenGL展示3D模型文件STL 突然发现上次写博客都是一年前了,没养成分享的习惯挺郁闷的,所以分享下个人感觉好玩的东西吧.纯理工科生笔杆子不硬,写的不好,哪里有看不懂的或者写的不好的希望 ...

最新文章

  1. 如何高效读论文?剑桥CS教授亲授“三遍论”:论文最多读三遍,有的放矢,步步深入...
  2. [翻译]pytest测试框架(二):使用
  3. .Net DES加密解密(不带向量)
  4. 红旗linux怎么更新,红旗linux7.0下自动更新firefox
  5. 【算法视频】字符串模式匹配--布鲁特.福斯算法
  6. Flink Exactly-Once 投递实现浅析 一致性
  7. 程序员如何高性能排序多个文件?
  8. android是j2me的一个实现吗,j2me与android的区别
  9. python 勒索病毒_lucky 勒索病毒分析与文件解密
  10. 如何将PPT中的图片无改变矢量图插入word中以及matlab矢量图插入word方法【每天一个小技巧】
  11. 马尔科夫matlab程序,马尔科夫链matlab代码
  12. TCP网络错误Connection reset by peer,peer是啥意思呢
  13. python输入包含20个数的列表_学习笔记20:Python基础使用(参数,嵌套,列表,元组,字典,字符串等)...
  14. 房子装修选择自装,物业办装修手续,需要哪些资料?
  15. 鲲鹏聚数,华为宣布联合高校发起GaussDB金种子发展计划
  16. 消防设施操作员考试真题、模拟练习题库(6)
  17. TCP/IP网络编程:P1->理解网络编程和套接字
  18. Miniconda软件安装教程(Windows)
  19. 计算机怎样将多行文字转换成表格,用WPS文本表格转换快速合并多行文字
  20. 2015年 android 白皮书

热门文章

  1. TCP三次握手之-awl工具-SYN洪水攻击
  2. 数据库之十二星座 水瓶座
  3. 寻找java项目/兼职
  4. ios appstore 审核 Guideline 5.2.2 - Legal ios新闻资讯类APP5.2.2被拒
  5. 绿米Aqara智能设备还能这样玩?
  6. 产品经理是做什么的?
  7. 万字详解!Git 入门最佳实践 !
  8. php迭代什么意思,迭代关系什么意思
  9. 中国移动力推多频5G全网通手机,或将成为业界标准
  10. 数据恢复软件从iOS恢复Safari浏览记录