Утечка памяти, когда s3 upload_file или put_object называется асинхронным - PullRequest
0 голосов
/ 20 октября 2019

Я метод, который загружает файлы, которые поступают в очередь в течение 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?

Или же сборщик мусора работает так, что он не освобождает память, пока не выйдет из цикла.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...