вызов функции:
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 вызывает такую ошибку.
Спасибо за ваш вклад.