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 的对话:
我制作了一个异步对象上传到 S3 并下载到您的计算机上。例如,为了确保在您的情况下文件将在上传后被删除,您可以使用回调:on_success
.
查看:https://gist.github.com/fherbine/0d4aa473e5cc2c5f6f8a0e1b35a62625
还有待改进,但它正在运行。
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 的对话:
我制作了一个异步对象上传到 S3 并下载到您的计算机上。例如,为了确保在您的情况下文件将在上传后被删除,您可以使用回调:on_success
.
查看:https://gist.github.com/fherbine/0d4aa473e5cc2c5f6f8a0e1b35a62625
还有待改进,但它正在运行。