zoukankan      html  css  js  c++  java
  • 06-python进阶-多线程下载器练手

    我们需要用python 写一个多线程的下载器

    我们要先获取这个文件的大小 然后将其分片 然后启动多线程 分别去下载 然后将其拼接起来

    #!/usr/bin/env python
    #coding:utf-8
    import requests

    from multiprocessing.dummy import Pool as ThreadPool

    class my_download(object):

    def __init__(self,URL):
    self.url = URL
    self.thread_num = 5
    self.file_nume = URL.split('/')[-1]
    url_headers = requests.head(self.url)
    self.total = int(url_headers.headers['Content-Length'])
    print self.total
    #print type('total is %s' % (self.total))

    def get_file_range(self):
    ranges = []

    download_num = int(self.total/self.thread_num)
    print download_num
    for i in range(self.thread_num):
    if i == self.thread_num-1:
    ranges.append((download_num*i,''))
    else:
    ranges.append((download_num*i,download_num*(i+1)))
    return ranges


    def download_file(self,val):
    f = open(self.file_nume, 'w')
    r = requests.get(self.url, headers={'Range': 'Bytes=%s-%s' % val, 'Accept-Encoding': '*'})
    f.seek(val[0])
    f.write(r.content)
    return f

    def run(self):

    file_list = self.get_file_range()
    #print file_list
    Pool = ThreadPool(4)
    res = map(self.download_file,file_list)

    for i in res:
    i.close()

    Pool.close()
    Pool.join()


    url = "https://img3.doubanio.com/icon/up121443072-1.jpg"
    downloader = my_download(url)
    downloader.run()
  • 相关阅读:
    C++中随机函数
    在cocos2d里面如何使用Texture Packer和像素格式来优化spritesheet
    CCParticleSystem粒子系统
    Redis百亿级Key存储方案
    Mongodb亿级数据量的性能测试
    mysql-mongdb-redis
    java常用的几种线程池比较
    Java中的多线程
    MySQL技术内幕InnoDB存储引擎(表&索引算法和锁)
    B+树介绍
  • 原文地址:https://www.cnblogs.com/nerdlerss/p/7250802.html
Copyright © 2011-2022 走看看