Boto3:等待S3流式上传完成

8
我正在使用S3.Client.upload_fileobj(),并使用BytesIO流作为输入,从流上传文件到S3。我的函数在上传完成之前不应该返回,因此我需要一种等待的方式。
从文档中没有明显的方法来等待传输完成,但有一些提示可以工作:
  1. 使用回调参数等待进度达到100%。在Javascript中,使用回调或承诺将是微不足道的,但在Python中我不确定。
  2. 使用S3.Waiter对象检查对象是否存在。但它通过每5秒轮询来进行检查,并且似乎非常低效。另外,我不确定它是否会等到对象完成。
  3. 有一个类S3.MultipartUpload,其中包含一个.complete()方法,但我怀疑它是否能实现我的要求。
  4. 做一个循环,检查对象是否完全上传,如果没有,则睡一会儿。但是如何检查对象是否完成?
我一直在搜索,但似乎没有人问同样的问题。此外,大多数涉及相关问题的结果都使用不同的API(我相信upload_fileobj()是相当新的)。
编辑 如果发现S3.Client.put_object也接受类似文件的对象,并阻止直到服务器响应。但是,与流结合使用会起作用吗?我不确定Python多线程在这里如何工作。流最初来自S3.Client.download_fileobj(),通过subprocess.Popen()进行传输,然后应该重新上传到S3。据我所知,下载和子进程都在并行线程/进程中运行。
1个回答

5

upload_file/upload_fileobj方法会处理你需要关注的事情(例如,等待对象/文件上传完成)。

我不建议使用第1或第4个选项。也没有必要使用s3 waiter,因为upload_file/upload_fileobj方法只有在上传作业完成后才会返回。

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


2
谢谢,Venkatesh。所以,你的回答实际上并没有直接回答我的问题,但还是有帮助的。根据你的代码,我看到你假设上传完成时方法返回。起初我对此表示怀疑,但后来查看了源代码。原来upload_fileobj实际上从传输管理器获取一个future,然后等待其完成,所以你是对的!一旦方法返回,上传就完成了。这对我帮助很大!如果你能编辑你的回答更简洁明确一些,我会接受它。谢谢! - cpury
@cpury 很高兴知道我的回答在某种程度上对你有所帮助!我很高兴你明白了我的意思。我编辑了我的回答,使其更加简洁和明确。我希望你现在能够接受它。附言:我发布准备好的/示例代码的唯一原因是“通过尝试并自己查看结果,它将为您澄清疑虑”,尽管发布整个代码并不必要。 - Venkatesh Wadawadagi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接