保护树状资源

mutextree的Python项目详细描述


black

保护树状资源:

https://raw.githubusercontent.com/SewanDevs/mutextree/master-github/images/mutextree-voc.png

节点必须用它们的完全限定名表示。 例如,节点d由[a,b,d]表示:

https://raw.githubusercontent.com/SewanDevs/mutextree/master-github/images/mutextree-qualified-name.png

锁定节点的算法如下:

  1. 我们按顺序锁定父节点:
https://raw.githubusercontent.com/SewanDevs/mutextree/master-github/images/mutextree-step1.pnghttps://raw.githubusercontent.com/SewanDevs/mutextree/master-github/images/mutextree-step2.png
  1. 然后检查是否没有子节点已锁定:
https://raw.githubusercontent.com/SewanDevs/mutextree/master-github/images/mutextree-step3.png
  1. 我们锁定想要的节点
https://raw.githubusercontent.com/SewanDevs/mutextree/master-github/images/mutextree-step4.png
  1. 我们释放所有不再使用的父锁。
https://raw.githubusercontent.com/SewanDevs/mutextree/master-github/images/mutextree-step5.png

接口目标与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覆盖率的合并。

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

推荐PyPI第三方库


热门话题
orm如何在Java中实现规范化映射?   java以编程方式修改Xtext生成的Mwe2工作流   java正在覆盖外部文件中的现有数据,如何停止?   java在ANTLR BNF语法符号中epsilon的等价物是什么?   java如何使用Hibernate@Anyrelated注释?   代码生成生成java类并在运行时加载它   java Maven无法在本地jar文件中收集依赖项   java NetBeans IDE 8.2不显示错误消息   java Selenium web驱动程序找不到元素   java如何修复“拒绝访问属性”invoke“”的权限?   JavaApacheJClouds,从比日期更早的blob中删除blob的最佳方法   java如何比较和排序树集中的项目?   使用JavaSpring和无头/解耦CMS   java使用swagercodegen在不同的类中生成端点   Java外部Keylistener没有响应