一个简单的多线程下载资源的Python脚本,主要实现部分包含两个类:
下载类:包含<代码>下载()代码>和<代码> get_complete_rate() 代码>两种方法。
-
<李>下载()方法种首先用urlopen()方法打开远程资源并通过内容长度获取资源的大小,然后计算每个线程应该下载网络资源的大小及对应部分吗,最后依次创建并启动多个线程来下载网络资源的指定部分。李>
<李> get_complete_rate()则是用来返回已下载的部分占全部资源大小的比例,用来回显进度。李>
ThreadDownload类:该线程类继承了threading.Thread类,包含了一个<代码> run() 代码>方法。
run()方法主要负责每个线程读取网络数据并写入本地。
#文件名:ThreadDownload.py 进口线程 urllib。要求进口* 类下载: def __init__(自我、链接、file_path thread_num): #下载路径 自我。链接=链接 #保存位置 自我。file_path=file_path #使用多少线程 自我。thread_num=thread_num #初始化线程数组 自我。线程=[] def下载(自我): 点播请求(url==自我。链接,方法=玫健? 要求的事情。add_header(‘接受’,‘*/*”) 要求的事情。add_header(“字符集”、“utf - 8”) 要求的事情。add_header(“连接”、“维生”) f=urlopen(要求) #获取要下载的文件的大小 自我。file_size=int (dict (f.headers)。(内容长度,0)) f.close () #计算每个线程要下载的资源的大小 current_part_size=自我。file_size//自我。thread_num + 1 因为我在范围(self.thread_num): #计算每个线程下载的开始位置 我* current_part_size start_pos=#每个线程使用一个世行模式打开的文件进行下载 t=(自我开放。file_path,“世界银行”) t。寻求(start_pos, 0) #创建下载线程 td=ThreadDownload(自我。链接、start_pos current_part_size, t) self.threads.append (td) td.start () #获下载的完成百分比 def get_complete_rate(自我): sum_size=0 因为我在范围(self.thread_num): sum_size +=self.threads[我]. length 返回sum_size/self.file_size 类ThreadDownload (threading.Thread): def __init__(自我、链接、start_pos、current_part_size current_part): super () . __init__ () #下载路径 自我。链接=链接 #当前线程的下载位置 自我。start_pos=start_pos #定义当前线程负责下载的文件大小 自我。current_part_size=current_part_size #当前文件需要下载的文件快 自我。current_part=current_part #定义该线程已经下载的字节数 自我。长度=0 def运行(自我): 点播请求(url==自我。链接,方法=玫健? 要求的事情。add_header(‘接受’,‘*/*”) 要求的事情。add_header(“字符集”、“utf - 8”) 要求的事情。add_header(“连接”、“维生”) f=urlopen(要求) #跳过self.start_pos个字节,表明该线程只负责下载自己负责的那部分内容 因为我在范围(self.start_pos): f.read (1) #读取网络数据,并写入本地 而自我。长度& lt;self.current_part_size: data=https://www.yisu.com/zixun/f.read (1024) 如果数据没有或len(数据)<=0: 打破 self.current_part.write(数据) #累计该线程下载的总大小 自我。长度+=len(数据) self.current_part.close () f.close ()
# !/usr/bin/env python # - * -编码:utf - 8 - * #文件名:thread_download-master.py 导入系统 导入的时间 从ThreadDownload进口* def show_process (dl): 虽然dl.get_complete_rate () & lt;1: complete_rate=int (dl.get_complete_rate () * 100) 打印(' \ r ' + '下载中···(已下载' + str (complete_rate) + ' %)”,结束="、冲洗=True) time . sleep (0.01) def main (): 试一试: 链接=输入(“(+)”+“链接:”) file_path=输入(“(+)”+“文件路径:”) thread_number=输入(“(+)”+“线程数:”) thread_number=int (thread_number) dl=下载(链接、file_path thread_number) dl.download () 打印(' \ n开始下载!”) show_process (dl) 打印(' \ r ' + '下载中···(已下载“+”100%)”,结束="、冲洗=True) 打印(' \ n下载完成!”) 除了例外: print(参数设置错误) sys.exit (1) if __name__==癬_main__”: main ()Python实现多线程下载脚本的示例代码