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

Is boto3.Bucket.upload_file blocking or non-blocking?

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

即如果我运行以下

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

根据文件的大小,我是否存在竞争条件?还是上传保证在文件删除前完成?

无论是阻塞还是解除阻塞,当事情变糟时,您不应该单独依赖 API。如果上传中途因任何原因失败(例如,管理员决定在您上传时重启路由器),您必须添加异常处理。

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 操作采取行动还允许您创建清理过程。(假设文件被锁定或文件被授予只读访问权限) .

当前 boto3 upload_file 正在阻塞。正如 mootmoot 所说,如果删除文件,您绝对应该实施一些错误处理以确保安全。

Boto3 不支持异步调用,所以函数是阻塞的。

在此处查看有关 async + boto3 的对话:

https://github.com/boto/boto3/issues/648

https://github.com/boto/boto3/issues/746

我制作了一个异步对象上传到 S3 并下载到您的计算机上。例如,为了确保在您的情况下文件将在上传后被删除,您可以使用回调:on_success.

查看:https://gist.github.com/fherbine/0d4aa473e5cc2c5f6f8a0e1b35a62625

还有待改进,但它正在运行。