2017-02-22 4 views
3

Я использую S3.Client.upload_fileobj() с потоком BytesIO в качестве входных данных для загрузки файла на S3 из потока. Моя функция не должна возвращаться до завершения загрузки, поэтому мне нужно подождать.Boto3: Подождите, пока потоковая загрузка S3 завершится

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

  1. Используйте обратного вызова ARG ждать, пока прогресс не на 100%. В Javascript это было бы тривиально с помощью обратных вызовов или обещаний, но в Python я не уверен.
  2. Используйте объект S3.Waiter, который проверяет, существует ли объект. Но он делает это, опросив каждые 5 секунд и кажется очень неэффективным. Также я не уверен, будет ли он ждать завершения объекта.
  3. Существует класс S3.MultipartUpload с методом .complete(), но я сомневаюсь, что делает то, что я хочу.
  4. Проведите цикл, который проверяет, полностью ли загружен объект, а если нет, спит понемногу. Но как проверить, завершен ли объект?

Я искал Google, но, похоже, никто не задает тот же вопрос. Кроме того, большинство результатов, касающихся связанных с этим проблем, использует другой API (я считаю, что upload_fileobj() довольно новый).

EDIT Если узнал о S3.Client.put_object, который также принимает файл-подобный объект и блоки, пока сервер не ответил. Но будет ли это работать в сочетании с потоками? Я не уверен, как здесь работает многопоточность Python. Поток поступает из S3.Client.download_fileobj(), получает канал через subprocess.Popen() и затем должен быть загружен обратно на S3. И загрузка, и подпроцесс выполняются параллельными потоками/процессами, как я могу сказать.

ответ

2

методы upload_file/upload_fileobj заботятся о вещах, которые вы ищете (например, они ждут завершения загрузки объекта/файла).

Я не предлагаю 1 или 4 варианта. Также нет необходимости использовать s3-официант, поскольку методы upload_file/upload_fileobj возвращаются только после завершения загрузки задания.

Обратите внимание, что методы upload_file/upload_fileobj будут автоматически обрабатывать файлы чтения/записи, а также выполнять параллельные параллельные загрузки для больших файлов, поэтому нет необходимости использовать многостраничную загрузку независимо от размера файла.

+1

Спасибо, Venkatesh. Итак, ваш ответ фактически не ответил на мой вопрос напрямую, но он все еще помог. Судя по вашему коду, я видел, что вы предполагаете, что загрузка завершена, когда метод возвращается. Сначала я сомневался в этом, но затем проверил исходный код. Оказывается, 'upload_fileobj' фактически получает« будущее »от диспетчера передачи, а затем ждет его завершения, поэтому вы правы! Как только метод вернется, загрузка будет выполнена. Это очень помогает! Если вы можете отредактировать свой ответ, чтобы быть более кратким и явным, я соглашусь с ним. Благодаря! – cpury

+0

@cpury Рад узнать, что мой ответ помог вам в пути! Я рад, что вы узнали/поняли, что я хотел передать. Я отредактировал свой ответ, чтобы быть более кратким и явным. Надеюсь, вы сможете принять его сейчас.P.S: Только причина публикации готового/примерного кода заключалась в том, что «он разъяснит вам сомнения, попробовав, и вы сами увидите результаты», хотя публикация всего кода не требуется. – Venkatesh

Смежные вопросы