使用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何时可以运行。toString()是否有可能返回重复的字符串?   使用REST进行Java应用程序登录验证?   java测试onErrorResume()Spring Webflux   java设置一个单元格样式,使数字显示为百分比ApachePOI   java仅替换regex az09   java将字符串附加到文件   java Hibernate:如何在集合中查找对象   当独立客户端为Web服务实例化代理时,java WebSphere会生成ClassNotFoundException   java简单算法。我做不好   java我的代码有什么问题?我想用Android制作一个“cardflip”动画   java如何模拟Springbean及其自动连接的参数?   java在Android中将arraylist对象的某些参数显示到列表视图中   java setOnclickListener(此)错误   java自动连接未按类型连接bean   java如何禁止在Viewpager上滑动?   java代码检查每个if语句吗?   java NIO选择器OP_READ和OP_WRITE,关于处理它们的一些问题   java如何在不锁定文件的情况下获取文件大小   Oculus Rift的Java API?   java是一种选择。仍然需要fork来设置bootClasspath