由于有个项目需要下载大量数据,数据大多是每个100MB左右,所以我想使用python + wget多线程下载的方式下载,设定下载子线程个数不得多于设定的个数,已经带有超时和重试次数的设定。
读取链接
这些链接我是从另外一个程序得到的,主要是是读取fits文件,然后将适合的链接输出到txt里,这里的readline_txt函数就是将txt里的链接读到一个列表里。
下载函数
Download_wget_OS(List,PATH)是利用wget shell命令来下载对应的链接,并返回此shell命令的执行状态。
MyThread
我写了个Thread的子类,对应我需要的情况,主要是增加返回值,用于检查子线程1的执行情况。
并行下载
Multi_process(List,PATH):#并行下载,这里的主要想法是设定一个列表,将子线程都添加进去,总线程个数>最大设定子线程个数+1,(主线程也算一个),则等待,如果小于等于就检查子线程列表里的结果,统计,并剔除掉列表里对应的完成的线程,然后再先列表添加新子线程。
代码
'''
docstring
'''
import os
import subprocess #shell 命令
import threading
import time
PATH = r'./Data'
output = './output.txt'#待下载的链接
#结果输出
timeout_txt = './timeout.txt'
succeed_txt = './succeed.txt'
wrong_txt = './wrong.txt'
Max_process_number = 6 #子线程个数
trytime = 3 #重试次数
Timeout = 60 #超时时间
def readline_txt(output):
with open(output, 'r') as f:#读取连接
LINK = f.readlines()#读取所有行
read = LINK[-1]#读取最后一行
LINK.pop()#移除掉最后一行注释
print(read + ' check ' + str(len(LINK)))
return LINK
def writing_txt_line(file_name,contents,Mode = 1):#输出记录
if Mode == 0 :
with open(file_name, 'w') as f:
f.writelines('')
else :
with open