Python多线程下载
- http: range, content-length
- python实现
HTTP Range, Content-Length:
Content-Length: 1394829
HTTP头Content-Length用于描述HTTP消息实体的传输长度
Range: bytes=0-1
HTTP头信息Range用于请求服务器返回文件的某个字段,不过在大部分情况请求页面文件不会返回该页面文件的字段,而是返回全部。
(0-1表示的是前两个字节)
实现
import os, sys
from urllib.request import *
from threading import Thread
urllib.request为我们提供访问该页面的方法。
threading.Thread为我们创建多线程。
url = "" #下载文件链接
threadnum = 5 #开启线程数
savepath = "" #文件保存地址
cachesize = 4096 #缓存大小
threadpool = [] #线程池
定义变量,缓存大小单位为字节,指储存在内存中(未写入文件)的大小。开5个线程就需要4096*5字节大小的内存。
def download(startpos, endpos, _id):
if _id == threadnum-1:
#是最后一个线程,下载完剩余的全部
endpos = filesize
download_size = endpos-startpos #总下载大小
download_num = download_size // cachesize #需要下载次数
#end_download_size = 0 if download_num*cachesize == download_size else download_size - download_num*cachesize #最后一次读取的大小,如果为0则代表总下载大小整除缓存数 (方便理解)
end_download_size = download_size % cachesize
#请求访问文件
reqfile = Request(