Python实现多线程下载脚本的示例代码

  

  

一个简单的多线程下载资源的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实现多线程下载脚本的示例代码