使用AWS DynamoDB实现持久性的Python分布式锁管理器

dynamo-dlm的Python项目详细描述


发电机dlm

Build StatusCoverage Status

使用AWS DynamoDB实现持久性的Python分布式锁管理器

目前,这个模块公开了一个分布式锁定原语DynamoDbLock,其功能与标准库中的threading.Lock类似

锁的作用域是逻辑资源,由一个任意但唯一标识的字符串表示,下面称为resource_id。 具有相同表名和资源id的DynamoDbLock的所有实例都将遵守锁规则。 默认情况下,锁查找名为dynamo_dlm_locks的DynamoDB表。 您可以使用下面概述的表的自定义名称。 表必须有一个名为String类型的主键,并且没有排序键:

您的应用程序需要以下权限才能正常工作:

关于容量和性能的说明:

lock类的设计使得它在正常情况下永远不会失败。 如果有足够的时间,它最终应该获得一个锁,即使同时有数千个请求。 使用按需容量时,所有锁每次都应在固定时间内获取。
DynamoDB提供的容量是一个非常深入的话题,但如果您正在使用它并遇到锁获取时间过长的问题,那么您可能需要增加写容量。 锁应该从不消耗读取容量。这是由于DynamoDB处理条件写入的方式造成的。 日志记录已添加到日志级别WARNING以通知您与已调配容量相关的任何退避。
当不受写容量或网络速度的限制时,在AWS之外运行时,平均获取/释放周期大约需要100ms。 如果您的执行环境在AWS中,则速度会明显加快,在同一区域内,执行速度可低至10毫秒。在

安装和使用

通过pip安装:

pip install dynamo-dlm

使用锁原语非常简单。 只需创建一个具有唯一标识符的实例并调用acquire()。 这将阻止任何其他实例对acquire()的调用,直到调用release()或锁过期,以先到者为准。 完成锁定所需的资源后,请调用release()放弃对锁的控制。 请记住:具有相同标识符和表名的所有实例都将使用相同的锁。 理想情况下,您希望将过期时间定为比预期操作所需时间稍长的时间。 锁只能以整秒的增量操作,因此最短的合理锁定时间为1秒。 在开发过程中,请密切关注WARNING记录器,以了解锁即将过期的迹象,这意味着操作花费的时间比预期的要长。在

importdynamo_dlmasdlmresource_id='a unique resource identifier'lock=dlm.DynamoDbLock(resource_id)lock.acquire()# Code executed here is protected by the lock until it expireslock.release()

lock类也作为上下文管理器实现:

^{pr2}$

默认情况下,如果不释放,锁将持续10秒。 可以在模块级别全局设置持续时间和/或表名:

importdynamo_dlmasdlmdlm.DEFAULT_DURATION=5dlm.DEFAULT_TABLE_NAME='my_dynamo_db_lock_table'resource_id='a unique resource identifier'lock=dlm.DynamoDbLock(resource_id)

它们也可以被每个锁覆盖:

importdynamo_dlmasdlmresource_id='a unique resource identifier'lock=dlm.DynamoDbLock(resource_id,duration=5,table_name='my_dynamo_db_lock_table')

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
选项卡内的java 安卓工具栏   java接口VS API VS公共类   无法解析java。lang.ClassNotFoundException:在安卓 studio中找不到类“com.example.安卓.camera2basic.AutoFitTextureView”?   java等待线程正常完成   java在JTable中的prepareRenderer方法中编辑单元格数据是否可行?   java SessionNotCreatedException selenium webdriver   java Android Studio Gradle CreateProcess错误=2   java找不到适用于异常(int)的构造函数   javascript如何在不使用正则表达式的情况下检查输入是否为表情符号?   从JAVA运行ant时,JAVA_HOME变量不正确   long的java min值引发异常   java如何在这段代码中实现侦听器?   带有透明文本的java Android按钮   图像Java扫描仪问题(JFrame)   java模拟输入蒸汽似乎在Junit测试的第一次输入中就被吃掉了   压缩Java Deflater,现在和将来的结果相同(确定性)   java JTable getModel()。setValueAt从数组中删除第一个元素   java我有不同于编译器和计算器的价值   使用C#客户端调用基本身份验证java webservice   java相同类型的多个@Embedded字段在持久化后始终为空