cpu*_*ury 5 python amazon-s3 boto amazon-web-services boto3
我使用S3.Client.upload_fileobj()了BytesIO流作为输入从流文件上传到S3。我的函数在上传完成之前不应该返回,所以我需要一种等待它的方法。
从文档中没有明显的方法来等待传输完成,但有一些提示可以工作:
S3.Waiter对象,如果检查对象存在。但它是通过每 5 秒轮询一次来实现的,而且似乎非常无效。另外我不确定它是否会等到对象完成。S3.MultipartUpload带有.complete()方法的类,但我怀疑它是否能满足我的要求。我一直在谷歌搜索,但似乎没有人问同样的问题。此外,大多数讨论相关问题的结果都使用了不同的 API(我认为这upload_fileobj()是相当新的)。
编辑
如果发现S3.Client.put_object它也接受类似文件的对象并阻止直到服务器响应。但这会与流结合使用吗?我不确定 Python 多线程在这里是如何工作的。该流最初来自 a S3.Client.download_fileobj(),通过 a 进行管道传输subprocess.Popen(),然后应该上传回 S3。据我所知,下载和子进程都在并行线程/进程中运行。
upload_file/upload_fileobj 方法负责处理您正在查找的内容(即它们等待对象/文件上传完成)。
我不建议第一个或第四个选项。也不需要使用 s3 waiter,因为 upload_file/upload_fileobj 方法仅在上传作业完成后返回。
请注意,upload_file/upload_fileobj 方法将自动处理读/写文件以及对大文件并行进行分段上传,因此无论文件大小如何,都无需使用分段上传。