可选择后端的分布式进程间锁。
sherlock的Python项目详细描述
Sherlock是一个提供易于使用的分布式进程间 锁定,还允许您为锁定选择后端 同步。
概述
当您使用由多个服务或 分布式服务,通常需要某种锁定机制 使一次访问某些资源成为可能。
分布式锁或互斥锁可以帮助您实现这一点。夏洛克提供 完全一样的设施,还有一些额外的东西。它提供了一个易于使用的api 类似于标准库的threading.lock语义。
除此之外,Sherlock还提供了使用后端的灵活性。 您管理锁的选择。
Sherlock还使您可以简单地扩展Sherlock以使用 不支持的后端。
功能
支持的后端和客户端库
每个支持的后端都支持以下客户端库:
- redis:redis-py
- memcached:pylibmc
- etcd:python-etcd
截至目前,仅支持上述库。尽管 Sherlock接受自定义客户端对象,以便您可以轻松地提供 要用于后端存储的设置,但夏洛克 检查提供的客户端对象是否是受支持客户端的实例 并接受通过此检查的客户端对象,即使api是 同样的。如果需要的话,如果 这是有需求的。
安装
安装很简单。
pip install sherlock
注意
Sherlock将安装所有 支持后端。
基本用法
sherlock在api和语义层使用起来很简单,它试图 符合标准库的threading.Lockapi。
importsherlockfromsherlockimportLock# Configure Sherlock's locks to use Redis as the backend,# never expire locks and retry acquiring an acquired lock after an# interval of 0.1 second.sherlock.configure(backend=sherlock.backends.REDIS,expire=None,retry_interval=0.1)# Note: configuring sherlock to use a backend does not limit you# another backend at the same time. You can import backend specific locks# like RedisLock, MCLock and EtcdLock and use them just the same way you# use a generic lock (see below). In fact, the generic Lock provided by# sherlock is just a proxy that uses these specific locks under the hood.# acquire a lock called my_locklock=Lock('my_lock')# acquire a blocking locklock.acquire()# check if the lock has been acquired or notlock.locked()==True# release the locklock.release()
支持with语句
# using with statementwithLock('my_lock'):# do something constructive with your locked resource herepass
阻塞和非阻塞api
# acquire non-blocking locklock1=Lock('my_lock')lock2=Lock('my_lock')# successfully acquire lock1lock1.acquire()# try to acquire lock in a non-blocking waylock2.acquire(False)==True# returns False# try to acquire lock in a blocking waylock2.acquire()# blocks until lock is acquired to timeout happens
同时使用两个后端
将sherlock配置为使用后端并不限制您使用 另一个后端同时。您可以导入后端特定的锁,如 redislock、mclock和etcdlock,使用它们的方式与使用泛型 锁(见下文)。实际上,sherlock提供的通用锁只是 在引擎盖下使用这些特定锁的代理。
importsherlockfromsherlockimportLock# Configure Sherlock's locks to use Redis as the backendsherlock.configure(backend=sherlock.backends.REDIS)# Acquire a lock called my_lock, this lock uses Redislock=Lock('my_lock')# Now acquire locks in MemcachedfromsherlockimportMCLockmclock=MCLock('my_mc_lock')mclock.acquire()
测试
要运行所有测试(包括集成),必须确保 数据库正在运行。确保所有服务都在运行:
# memcached memcached # redis-server redis-server # etcd (etcd is probably not available as package, here is the simplest way # to run it). wget https://github.com/coreos/etcd/releases/download/<version>/etcd-<version>-<platform>.tar.gz tar -zxvf etcd-<version>-<platform>.gz ./etcd-<version>-<platform>/etcd
像这样运行测试:
python setup.py test
文档
可用here。
路线图
- 支持将Zookeeper作为后端。
- 支持Gevent、Multithreading和Multiprocessing。
有问题吗?
我们鼓励您使用issues来提问,因为这样可以帮助每个人和 当我自己有更好的专业知识的人参与讨论时。然而, 如果你想亲自与我联系,我可以通过 kapoor.vaidik++github+sherlock@gmail.com。
其他语言中的分布式锁定
更改日志
开发版本
0.3.2
- [错误修正]redis>;=2.10.6客户端无法与夏洛克0.3.1一起工作
0.3.1
- [bugfix]python 3支持sherlock
0.3.0
- [错误修复]sherlock.lock应使用全局配置的客户端对象。