Я использую S3.Client.upload_fileobj()
с потоком BytesIO
в качестве входных данных для загрузки файла на S3 из потока. Моя функция не должна возвращаться до завершения загрузки, поэтому мне нужно подождать.Boto3: Подождите, пока потоковая загрузка S3 завершится
Из документации не существует никакого очевидного способа ждать передачи, чтобы закончить, но есть некоторые намеки на то, что могли работы:
- Используйте обратного вызова ARG ждать, пока прогресс не на 100%. В Javascript это было бы тривиально с помощью обратных вызовов или обещаний, но в Python я не уверен.
- Используйте объект
S3.Waiter
, который проверяет, существует ли объект. Но он делает это, опросив каждые 5 секунд и кажется очень неэффективным. Также я не уверен, будет ли он ждать завершения объекта. - Существует класс
S3.MultipartUpload
с методом.complete()
, но я сомневаюсь, что делает то, что я хочу. - Проведите цикл, который проверяет, полностью ли загружен объект, а если нет, спит понемногу. Но как проверить, завершен ли объект?
Я искал Google, но, похоже, никто не задает тот же вопрос. Кроме того, большинство результатов, касающихся связанных с этим проблем, использует другой API (я считаю, что upload_fileobj()
довольно новый).
EDIT Если узнал о S3.Client.put_object
, который также принимает файл-подобный объект и блоки, пока сервер не ответил. Но будет ли это работать в сочетании с потоками? Я не уверен, как здесь работает многопоточность Python. Поток поступает из S3.Client.download_fileobj()
, получает канал через subprocess.Popen()
и затем должен быть загружен обратно на S3. И загрузка, и подпроцесс выполняются параллельными потоками/процессами, как я могу сказать.
Спасибо, Venkatesh. Итак, ваш ответ фактически не ответил на мой вопрос напрямую, но он все еще помог. Судя по вашему коду, я видел, что вы предполагаете, что загрузка завершена, когда метод возвращается. Сначала я сомневался в этом, но затем проверил исходный код. Оказывается, 'upload_fileobj' фактически получает« будущее »от диспетчера передачи, а затем ждет его завершения, поэтому вы правы! Как только метод вернется, загрузка будет выполнена. Это очень помогает! Если вы можете отредактировать свой ответ, чтобы быть более кратким и явным, я соглашусь с ним. Благодаря! – cpury
@cpury Рад узнать, что мой ответ помог вам в пути! Я рад, что вы узнали/поняли, что я хотел передать. Я отредактировал свой ответ, чтобы быть более кратким и явным. Надеюсь, вы сможете принять его сейчас.P.S: Только причина публикации готового/примерного кода заключалась в том, что «он разъяснит вам сомнения, попробовав, и вы сами увидите результаты», хотя публикация всего кода не требуется. – Venkatesh