Boto3:等待S3流式上传完成
问题描述:
我使用S3.Client.upload_fileobj()
和BytesIO
流作为输入,以将文件从流上载到S3。我的功能不应该在上传完成之前返回,所以我需要一种方法来等待它。Boto3:等待S3流式上传完成
从文档没有明显的方式来等待转移完成,但有什么可能工作的一些提示:
- 使用回调ARG等到进展在100%。在JavaScript中,使用回调或承诺是微不足道的,但在Python中我不太确定。
- 使用a
S3.Waiter
对象检查对象是否存在。但它通过每5秒轮询一次并且看起来非常无效。另外我不确定是否等到物体完成。 - 有一个类
S3.MultipartUpload
与.complete()
方法,但我怀疑这是否是我想要的。 - 做一个循环检查对象是否完全上传,如果没有,睡一会儿。但是,如何检查对象是否完整?
我一直在谷歌搜索,但似乎没有人问同样的问题。另外,大多数关于相关问题的结果都使用了不同的API(我相信upload_fileobj()
是相当新的)。
编辑 如果发现了S3.Client.put_object
这也接受一个类似文件的对象和块,直到服务器响应。但是,这会与流结合使用吗?我不确定Python多线程如何在这里工作。该流最初来自S3.Client.download_fileobj()
,通过subprocess.Popen()
获取管道,然后应该被上传回S3。我可以看到,下载和子进程都以并行线程/进程运行。
答
upload_file/upload_fileobj方法照顾你正在寻找的东西(即他们等待完成对象/文件上传)。
我不建议第1或第4选项。无需使用s3服务器,因为upload_file/upload_fileobj方法仅在上传作业完成后才返回。
请注意,upload_file/upload_fileobj方法将自动处理读取/写入文件以及对大文件并行进行分段上传,因此无需使用分段上传而不考虑文件大小。
谢谢,Venkatesh。所以,你的回答并没有直接回答我的问题,但它仍然有帮助。从你的代码判断,我看到你认为上传在方法返回时完成。起初我对此有疑问,但后来检查了源代码。事实证明'upload_fileobj'实际上从传输管理器获得'future',然后等待完成,所以你是对的!一旦该方法返回,上传就完成了。这有助于很多!如果您可以编辑您的答案以更加简洁和明确,我会接受它。谢谢! – cpury
@cpury很高兴知道我的答案以某种方式帮助了你!我很高兴你发现/意识到我想表达的意思。我编辑了我的答案,以更简洁明确。我希望你现在可以接受它。上议员:发布现成的/示例代码的唯一原因是“它会通过尝试澄清对你的怀疑,你可以自己看到结果”,尽管发布整个代码是没有必要的。 – Venkatesh