boto3.Bucket.upload_file方法是阻塞还是非阻塞的?
换句话说,如果我运行以下代码:
bucket = session.Bucket(bucket_name)
bucket.upload_file(Key=s3_key, Filename=source_path)
os.remove(source_path)
如果文件很大,我是否会遇到竞态条件?或者上传是否保证在文件被删除之前完成?
boto3.Bucket.upload_file方法是阻塞还是非阻塞的?
换句话说,如果我运行以下代码:
bucket = session.Bucket(bucket_name)
bucket.upload_file(Key=s3_key, Filename=source_path)
os.remove(source_path)
如果文件很大,我是否会遇到竞态条件?或者上传是否保证在文件被删除之前完成?
当前的boto3 upload_file
是阻塞的。正如mootmoot所说,如果你删除文件,一定要实现一些错误处理来确保安全。
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操作进行操作,同时还可以创建清理过程,如果上传成功但本地文件删除失败,则可以执行此过程。(想象一下文件被锁定或文件被设置为只读访问)。
on_success
。