Maison > Questions et réponses > le corps du texte
Lorsque vous utilisez Python pour explorer des données, activez l'exploration multithread en un seul processus. Après tout, je n'ai pas plusieurs processus en raison de conditions intensives en E/S.
Le code est le suivant
def get_downloads_url_list(self,pageNum):
FilePath='C:/RMDZY/h'+str(pageNum)
os.chdir(FilePath)
with open(FilePath+'/m3u8.txt', 'r') as f:
m3u8_txt = f.read()
download_ts_list = re.findall(r'ppvod' + r'\d{7}' + r'.ts', m3u8_txt)
download_url_list = [url + str(pageNum) + '/1000kb/hls/' + download_ts_list[i] for i in
range(len(download_ts_list))]
max_length=len(download_url_list)
dat_list=['ts'+str(i)+'.ts' for i in range(max_length)]
dat_str='+'.join(dat_list)
ts_command='copy /b '+dat_str+' new.ts'
with open('ts.bat','w') as f:
f.write(ts_command)
return download_url_list
def download_by_m3u8(self,i,pageNum):
download_list=self.get_downloads_url_list(pageNum)
ts_file = requests.get(download_list[i], verify=False)
with open('ts'+str(i)+'.ts','ab') as f:
f.write(ts_file.content)![图片描述][1]
def download_threading(self,pageNum):
download_list=self.get_downloads_url_list(pageNum)
thread_list=[]
for i in range(len(download_list)):
thread = threading.Thread(target=self.download_by_m3u8, args=[i,pageNum])
thread_list.append(thread)
thread.start()
for thread in thread_list:
thread.join()
Mais tant que les requêtes d'un thread ne renvoient pas de valeur, le thread continuera d'attendre et n'écrira pas, il y aura donc un problème que le processus principal ne soit pas bloqué.
Comme le montre l'image
Comment gérer cela, par exemple, définir un délai d'attente pour request.get, mais que faire une fois qu'il est dépassé ? Après avoir défini le délai d'attente, il semble que le thread ait été tué directement et je peux continuer à télécharger la cible suivante ? , mais celui-ci n'est pas téléchargé. Je suis comme cet enregistrement, pouvez-vous intercepter cette exception et vous reconnecter ? L’essentiel c’est d’écrire, je ne suis pas très doué pour ça. Tellement inconnu
ringa_lee2017-05-18 11:04:31
num = 3 # 重试次数
while num > 0:
try:
result = requests.get(..., timeout=3)
except requests.exceptions.ReadTimeout:
print 'Timeout, try again'
num -= 1
else:
# 成功获取
print 'ok'
print result
break
else:
# 3次都失败
print 'Try 3 times, But all failed'