Python iter_content и ошибка многопроцессорной обработки - PullRequest
0 голосов
/ 30 августа 2018

вызов функции:

 downloaded_files = pool.starmap(utils.retrieve_demofiles, list(zip(urls, self.demo_match_urls, fullfilenames)))

Источник ошибки:

def retrieve_demofiles(url, filename, fullfilename, headers = {}):
 print('\n Now downloading: ', filename)
 user_agent_addition = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1941.0 Safari/537.36'}
 headers = dict(headers.items() | user_agent_addition.items())
 succesfull_file = False

 for i in range(constants.download_rety_count):# check file availiblity
    response = requests.head(url, headers=headers, allow_redirects=True)
    print('Type ', response.headers['content-type'])
    contentType = response.headers['content-type']
    if contentType in constants.valid_compressed_mime_types:
        succesfull_file = True
        break
    else:
        time.sleep(1)

 if not succesfull_file:
    #print("ERROR: Not expected file: {}".format(filename))
    logger.exception("ERROR: Not expected file: {}".format(filename))
    return (None, None)

 try:
    r = requests.get(url, stream=True, headers=headers, timeout = 10)
    r.raise_for_status()
 except requests.exceptions.HTTPError as errh:
    logger.exception("Http Error: ",errh)
 except requests.exceptions.ConnectionError as errc:
    logger.exception("Error Connecting: ",errc)
 except requests.exceptions.Timeout as errt:
    logger.exception("Timeout Error: ",errt)
 except requests.exceptions.RequestException as err:
    logger.exception("Error: ",err)
 finally:
    #print('Type ', r.headers['content-type'], 'Name ', filename)
    # Total size in bytes.
    total_size = int(r.headers.get('content-length', 0));
    block_size = 1024
    wrote = 0
    logger.error('Total size: {}'.format(math.ceil(total_size//block_size)))
    with open(fullfilename, 'wb') as f:
        # for data in tqdm.tqdm(r.iter_content(block_size), total=int(total_size//block_size) , unit='KB', unit_scale=True, leave=True):
        for block in r.iter_content(block_size): #source of error -> begin
            try:
                wrote = wrote  + len(block)
                f.write(block)
                sys.stdout.flush()
            except Exception as e:
                logger.error(e) #source of error-> end
    # # if total_size != 0 and wrote != total_size:
    #     print("ERROR: Failed to download: {}".format(filename))
    #     logger.exception("ERROR: Failed to download: {}".format(filename))
    #     return (None, None)
    # else:
    #     print("Succesfully downloaded: {}".format(filename))
    #     logger.info("Succesfully downloaded: {}".format(filename))
    #     return (fullfilename, filename)
    print('returned: ', os.getpid())
    r.close()

Я получаю сообщение об ошибке: RuntimeError: невозможно присоединиться к текущему потоку .

Кроме этой ошибки, метод успешно записывает загруженные файлы на диск без каких-либо ошибок. Эта ошибка появляется, когда программа заканчивается. Источником ошибки является цикл for при чтении потока с использованием iter_content . Когда я удаляю это для цикла, но вместо этого помещаю инструкцию pass, она работает нормально (конечно, она ничего не делает). Я не понимаю, почему iter_content вызывает такую ​​ошибку.

Спасибо за ваш вклад.

...