Я метод, который загружает файлы, которые поступают в очередь в течение 3 часов (3 в секунду), которые должны быть загружены в корзину s3. upload_file/put_object
блокирует каждый раз, что задерживает мой общий процесс.
Чтобы сделать эти загрузки асинхронными, я попытался вызвать метод загрузки в потоке, подобном этому
while not self.queue.empty():
file_path = None
try:
file_path = self.queue.get(True, 0.16)
file_name = file_path.replace("{}/".format(self.source_path), "")
print("uploader uploading {}".format("/".join([self.asset_id, file_name])))
t = threading.Thread(target=self.upload_file, args=(file_path,))
t.start()
threads.append(t)
# async call. dont wait for upload_file to return to start the next one.
t = threading.Thread(target=self.client.upload_file, args=(file_path, MY_BUCKET, "/".join([self.asset_id, file_name])))
t.start()
# blocking call
# self.client.upload_file(file_path, MY_BUCKET, "/".join([self.asset_id, file_name]))
except Queue.Empty:
break
except Exception as e:
print("Exception in uploading to s3. Going to retry! e: {}".format(e))
self.queue.put(file_path)
else:
print("check memory now")
time.sleep(60)
Каждый из этих файловзанимают около 1 МБ и за определенный период времени память переполняется и вылетает из приложения. В том же случае, если я включаю блокирующий вызов, он не пропускает память, но загрузка занимает много времени.
Это утечка памяти какого-то рода в boto3 upload_file
?
Или же сборщик мусора работает так, что он не освобождает память, пока не выйдет из цикла.