Rumah  >  Soal Jawab  >  teks badan

Fail merangkak berbilang benang Python, cara menetapkan tamat masa untuk menyambung semula.

Apabila menggunakan python untuk merangkak data, dayakan merangkak berbilang benang dalam satu proses Lagipun, saya tidak mempunyai berbilang proses kerana keadaan intensif IO.


Kod adalah seperti berikut

    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()

Tetapi selagi permintaan benang tidak mengembalikan nilai, benang akan terus menunggu dan tidak akan menulis, jadi akan ada masalah bahawa proses utama tidak disekat.
Seperti yang ditunjukkan dalam gambar


Bagaimana untuk menanganinya, sebagai contoh, tetapkan tamat masa untuk permintaan.dapatkan, tetapi apa yang perlu dilakukan selepas ia melebihi Selepas saya menetapkan tamat masa, nampaknya benang itu telah dibunuh secara langsung, dan saya boleh terus memuat turun sasaran seterusnya , tetapi yang ini tidak dimuat turun Saya seperti Rekod ini, bolehkah anda menangkap pengecualian ini dan menyambung semula? Perkara utama adalah menulis, saya tidak begitu mahir. Sangat tidak dikenali

黄舟黄舟2711 hari yang lalu770

membalas semua(1)saya akan balas

  • ringa_lee

    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'
        

    balas
    0
  • Batalbalas