【问题标题】:Is boto3.Bucket.upload_file blocking or non-blocking?boto3.Bucket.upload_file 是阻塞还是非阻塞?
【发布时间】:2020-08-08 18:01:11
【问题描述】:

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

即如果我要运行以下内容

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

我是否有竞争条件,取决于文件的大小?还是保证在文件删除之前完成上传?

【问题讨论】:

标签: python amazon-web-services amazon-s3 boto3


【解决方案1】:

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

【讨论】:

  • 为什么这与下面的答案完全相反?我们能得到一些确凿的证据吗?
【解决方案2】:

无论是阻塞还是解除阻塞,当出现问题时,您都不应仅依赖 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 存储桶添加事件以对成功 PUT 操作进行操作,如果上传成功但本地文件删除失败,您还可以创建清理过程。(想象文件被锁定或文件被授予只读访问权限)。

【讨论】:

    【解决方案3】:

    Boto3 不支持异步调用,因此函数处于阻塞状态。

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

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

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

    【讨论】:

    • 我的证据是它是非阻塞的,因为我通过文件上传循环并删除了本地源文件。十分之一,上传失败,因为找不到源文件。是的,我可以针对它进行防御性编码。但是最好明确地澄清这一点以了解正在发生的事情。
    【解决方案4】:

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

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

    仍有增强功能,但它正在工作。

    【讨论】:

      猜你喜欢
      • 2021-12-26
      • 2012-11-13
      • 2014-10-19
      • 1970-01-01
      • 1970-01-01
      • 2013-05-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多