Boto3:等待 S3 流上传完成

cpu*_*ury 5 python amazon-s3 boto amazon-web-services boto3

我使用S3.Client.upload_fileobj()BytesIO流作为输入从流文件上传到S3。我的函数在上传完成之前不应该返回,所以我需要一种等待它的方法。

从文档中没有明显的方法来等待传输完成,但有一些提示可以工作:

  1. 使用回调 arg等待进度达到 100%。在 Javascript 中,使用回调或承诺这将是微不足道的,但在 Python 中我不太确定。
  2. 使用一个S3.Waiter对象,如果检查对象存在。但它是通过每 5 秒轮询一次来实现的,而且似乎非常无效。另外我不确定它是否会等到对象完成。
  3. 有一个S3.MultipartUpload带有.complete()方法的类,但我怀疑它是否能满足我的要求。
  4. 执行一个循环,检查对象是否已完全上传,如果没有,则休眠一段时间。但是如何检查对象是否完整?

我一直在谷歌搜索,但似乎没有人问同样的问题。此外,大多数讨论相关问题的结果都使用了不同的 API(我认为这upload_fileobj()是相当新的)。

编辑 如果发现S3.Client.put_object它也接受类似文件的对象并阻止直到服务器响应。但这会与流结合使用吗?我不确定 Python 多线程在这里是如何工作的。该流最初来自 a S3.Client.download_fileobj(),通过 a 进行管道传输subprocess.Popen(),然后应该上传回 S3。据我所知,下载和子进程都在并行线程/进程中运行。

Ven*_*agi 5

upload_file/upload_fileobj 方法负责处理您正在查找的内容(即它们等待对象/文件上传完成)。

我不建议第一个或第四个选项。也不需要使用 s3 waiter,因为 upload_file/upload_fileobj 方法仅在上传作业完成后返回。

请注意,upload_file/upload_fileobj 方法将自动处理读/写文件以及对大文件并行进行分段上传,因此无论文件大小如何,都无需使用分段上传。

  • 谢谢,文卡特什。所以,你的回复实际上并没有直接回答我的问题,但仍然有帮助。从您的代码来看,我发现您假设方法返回时上传已完成。起初我对此表示怀疑,但后来查看了源代码。事实证明,“upload_fileobj”实际上从传输管理器获取了一个“future”,然后等待其完成,所以你是对的!一旦该方法返回,上传就完成了。这很有帮助!如果您可以将您的答案编辑得更加简洁和明确,我会接受。谢谢! (2认同)