boto3.Bucket.upload_file是阻塞还是非阻塞的?

11

boto3.Bucket.upload_file方法是阻塞还是非阻塞的?

换句话说,如果我运行以下代码:

bucket = session.Bucket(bucket_name)
bucket.upload_file(Key=s3_key, Filename=source_path)
os.remove(source_path)

如果文件很大,我是否会遇到竞态条件?或者上传是否保证在文件被删除之前完成?


同步或异步 - tedder42
1
我最近更详细地研究了这个问题:让Boto3上传调用变成阻塞式(单线程) - Brad Solomon
4个回答

3

当前的boto3 upload_file 是阻塞的。正如mootmoot所说,如果你删除文件,一定要实现一些错误处理来确保安全。


7
为什么这与下面的答案完全相反?我们能否得到一些确定性的证据? - retrocookie

2

我的证据是它是非阻塞的,因为我通过一个上传循环遍历文件,并删除本地源文件。每10次中有1次上传失败,因为找不到源文件。是的,我可以进行防御性编码来解决这个问题。但是弄清楚发生了什么将是很好的。 - John Curry

2
无论是阻塞还是非阻塞,当上传遇到问题时,您不应仅依赖API。如果由于任何原因(例如管理员决定在您进行上传时重新启动路由器)导致上传失败,您必须添加异常处理。请注意保留HTML标签。
bucket = session.Bucket(bucket_name)
try :
  bucket.upload_file(Key=s3_key, Filename=source_path)
  os.remove(source_path)
except : 
  raise

另一种优秀的将文件上传到S3的方法是添加附加元数据。

bucket.upload_file(
     Key=s3_key, 
     Filename=source_path, 
     extra_args={'Metadata': {'source_path': source_path}}
) 

将事件添加到S3 Bucket以对成功的PUT操作进行操作,同时还可以创建清理过程,如果上传成功但本地文件删除失败,则可以执行此过程。(想象一下文件被锁定或文件被设置为只读访问)。


1
我已经制作了一个异步对象,用于上传到S3并下载到您的计算机。为确保在您的情况下例如文件在上传后将被删除,您可以使用回调函数:on_success
查看此链接:https://gist.github.com/fherbine/0d4aa473e5cc2c5f6f8a0e1b35a62625 还有一些改进需要完成,但它目前已经可用。

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