2017-02-22 125 views
3

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

从文档没有明显的方式来等待转移完成,但有什么可能工作的一些提示:

  1. 使用回调ARG等到进展在100%。在JavaScript中,使用回调或承诺是微不足道的,但在Python中我不太确定。
  2. 使用a S3.Waiter对象检查对象是否存在。但它通过每5秒轮询一次并且看起来非常无效。另外我不确定是否等到物体完成。
  3. 有一个类S3.MultipartUpload.complete()方法,但我怀疑这是否是我想要的。
  4. 做一个循环检查对象是否完全上传,如果没有,睡一会儿。但是,如何检查对象是否完整?

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

编辑 如果发现了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'实际上从传输管理器获得'future',然后等待完成,所以你是对的!一旦该方法返回,上传就完成了。这有助于很多!如果您可以编辑您的答案以更加简洁和明确,我会接受它。谢谢! – cpury

+0

@cpury很高兴知道我的答案以某种方式帮助了你!我很高兴你发现/意识到我想表达的意思。我编辑了我的答案,以更简洁明确。我希望你现在可以接受它。上议员:发布现成的/示例代码的唯一原因是“它会通过尝试澄清对你的怀疑,你可以自己看到结果”,尽管发布整个代码是没有必要的。 – Venkatesh