保护树状资源
mutextree的Python项目详细描述
保护树状资源:
节点必须用它们的完全限定名表示。 例如,节点d由[a,b,d]表示:
锁定节点的算法如下:
- 我们按顺序锁定父节点:
- 然后检查是否没有子节点已锁定:
- 我们锁定想要的节点
- 我们释放所有不再使用的父锁。
接口目标与threading.Lock完全相同。
互斥树实际上被设计为使用redis和python redis锁,但是锁的后端可能会改变。
用法
要在redis锁的后端使用mutextree,只需实例化一个redis客户机并创建锁。 redis客户端应该是严格的,并对响应本身进行解码。
importredisfrommutextreeimportRedisLockBackend,TreeLockredis_client=redis.StrictRedis(decode_responses=True)redis_lock_backend=RedisLockBackend(redis_client)lock=TreeLock(redis_lock_backend,["nodeA"],expire=10,timeout=10,id=1)try:lock.acquire()# do thingsfinally:lock.release()
您可以将其用作上下文管理器或装饰器:
importredisfrommutextreeimportRedisLockBackend,TreeLock,tree_lockredis_client=redis.StrictRedis(decode_responses=True)redis_lock_backend=RedisLockBackend(redis_client)withTreeLock(redis_lock_backend,["nodeA"],expire=10):# do thingspass# release will be automatically called# Or with a decorator@tree_lock(redis_lock_backend,["nodeA"],expire=10)defprotected_function():# do thingspass# release will be automatically called
lock与threading.lock()具有相同的基本接口,还有一些方法:acquire、release、refresh。
测试
测试应该在Python2.7和Python3.6下运行,以测试所有内容
$ pip install tox $ tox -e py27,py36
覆盖率报告将是PY27和PY36覆盖率的合并。