python - 尝试使用 AWS s3.put_object 创建一个相同的空文件,由多个进程并行使用 python
问题描述
假设如果两个(可以是任意数量)进程试图并行访问相同的代码块,为了避免并行访问,我试图在 s3 存储桶中创建一个空文件,这样如果该文件存在,那么其他进程在第一个进程结束使用代码块之前,它试图访问必须等待。使用后,第一个进程将删除空文件,这意味着第二个进程现在可以通过创建空文件并持有锁来使用该代码块。
import boto3
s3 = boto3.client('s3')
def create_obj(bucket, file):
s3.put_object(Bucket=bucket, Key=file)
return "file created"
job1 = create_obj(bucket="s3bucketname", file='xyz/empty_file.txt')
job2 = create_obj(bucket="s3bucketname", file='xyz/empty_file.txt')
这里假设 job1 和 job2 正在尝试并行访问相同的 create_obj 以创建 create empty_file.txt
,这意味着它们同时打线s3.put_object
。然后其中一项工作必须等待。这里 n 个作业可以create_obj
并行访问该功能。我们需要确保这些作业如上文所述正确执行。
请帮我解决一下这个。
解决方案
我的理解是你试图在S3的基础上实现分布式锁定机制。
由于在 re:invent 2020 上更新了 S3 一致性模型,这可能是可能的,但您也可以使用 DynamoDB 之类的服务,这样可以更轻松地构建这些模型。
我建议您查看AWS 博客上的这篇博文,其中描述了该过程。由于此处不鼓励仅提供链接的答案,因此我将尝试总结这个想法,但您真的应该阅读完整的文章。
- 您
PutItem
对表中的锁定项进行条件调用。条件是,具有该密钥的项目不存在或已过期。新项目包含:- 锁的名称(分区键)
- 该锁应该有效多长时间
- 创建锁的时间戳
- 一些标识您的系统的标识符(锁定实体)
- 如果 put 有效,您就知道您已经获得了锁,如果失败,您就知道它已经被锁定,可以稍后重试
- 然后你执行你的工作
- 最后你删除了锁定项目
有一个 Python 的实现以及PyPi 上的 python-dynamodb-lock
推荐阅读
- python - 将特定文本放入 pandas 数据框中,使用 BeautifulSoup 进行网络抓取
- c# - Ef Core 一对多与连接表
- javascript - javascript 中的三元条件未选择按钮单选
- android-viewpager2 - 与 viewpager2 和异步 diffutilities 一起使用时,Recyclerview 未显示正确的值
- shell - 通过 shell 命令在 Make 中分配宏值
- python-3.x - 弹出 Flask 应用程序上下文时出错
- mysql - 将 MySQL 从 5.7.18 升级到 5.7.30 时,遇到错误
- c++ - 向量中的 Gcov 分支::push_back 函数调用
- node.js - 为什么在 nodejs 中设置不同的键时所有对象键值都设置为相同的值?
- php - 是否有函数也暂停 php 代码执行而不是 sleep()?