我使用 S3.Client.upload_fileobj()
和 BytesIO
流作为输入,将文件从流上传到 S3。我的函数不应该在上传完成之前返回,所以我需要一种等待它的方法。
从文档中看,没有明显的方法可以等待传输完成,但是有一些提示可以工作:
- 使用回调参数等待进度达到 100%。在 Javascript 中,使用回调或 promise 这将是微不足道的,但在 Python 中我不太确定。
- 使用
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 methods take care of the things you're looking for (i.e they wait for completion of object/file uploading).
我不建议第一个或第四个选项。也不需要使用 s3 waiter,因为 upload_file/upload_fileobj 方法仅在上传作业完成后返回。
请注意,upload_file/upload_fileobj 方法将自动处理读/写文件以及对大文件并行进行分段上传,因此无论文件大小如何,都无需使用分段上传。
关于python - Boto3:WAITINGS3流式上传完成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42382693/