当前位置 博文首页 > 一条IT:【python实战】多线程下载文件

    一条IT:【python实战】多线程下载文件

    作者:[db:作者] 时间:2021-08-13 12:49

    ?点赞再看,养成好习惯

    哈喽,大家好,我是一条。

    相信大家都遇到过下载文件过慢的时候,今天教大家多线程下载,快到飞起。

    1.实现原理

    • 根据url后利用request库获得数据,保存到文件。
    • 将文件分成若干部分,由若干线程分别去下载,再按顺序将文件拼接到一起。

    2.实现思路

    1.获取文件大小

    根据url获得请求头后发现是一个json串,格式化后找到大小

        res=requests.head(url)
        size = int(res.headers['Content-Length'])

    2.分割文件

        n=5
        spos = []
        fpos = []
        persize=size//n #每一份的大小
        intsize=persize*n #整份的大小
        for i in range(0,intsize,persize):
            spos.append(i) #每一段的初值
            fpos.append(i+persize-1) #每一段的终值
        if(intsize<size):
            fpos[n-1]=size #不能整除的剩余部分

    3.下载并写入文件

        try:
            header={}
            header["Range"] = "bytes={}-{}".format(spos,fpos) #截取一部分
            result=requests.get(url,headers=header)
            fp.seek(spos) #找到文件写到的指针位置,在后面续写
            fp.write(result.content)
        except Exception:
            print(Exception)

    4.对下载方法用多线程

        import threading
        for i in range(0,n):
            t=threading.Thread(
                target=load,  #下载方法
                args=(
                    url,spos[i],fpos[i],fp
                )
            )
            t.setDaemon(True) 
            t.start()
            tmp.append(t)
        for i in tmp:
            i.join()

    5.测速

        t0=time.time()
        t1=time.time()
        to=t1-t0
        print("total_time:%.2f s"% to)
        speed=float(size)/(1000*(to))
        print("speed:%.2f KB/s"% speed)

    3.效果展示

    找到某盘下载地址(浏览器下载记录里有)total size: 6975060

    开2个线程:
    total_time:42.45 s
    speed:164.33 KB/s

    开20个线程:

    total_time:4.77 s
    speed:1463.42 KB/s

    ?


    我是一条,一个在互联网摸爬滚打的程序员。

    道阻且长,行则将至。大家的?【点赞,收藏,关注】?就是一条创作的最大动力,我们下期见!

    注:关于本篇博客有任何问题和建议,欢迎大家留言!

    ?

    cs
    下一篇:没有了