Python中的分布式锁,类似于https://github.com/vaidik/sherlock同时支持异步
shylock的Python项目详细描述
Python上的分布式锁,支持异步
这是什么?在
当您有一个分布式系统(如任何API)并且您希望确保数据的一致性并防止竞争条件时,就需要锁。实现它们的方法有很多种,这个库旨在提供一些更好的方法的简单访问。在
该库主要用于异步代码,但也支持正常的同步使用。在
当前支持的后端:
- MongoDB(使用唯一索引+ttl索引以确保一致性和安全性)
- ArangoDB(使用唯一索引+ttl索引以确保一致性和安全性)
可以很容易地扩展到其他存储系统。在
许可证
许可证很重要。本项目本身使用BSD 3-clause许可证,但例如Mongodb Motor library和它使用的其他此类库可能有自己的许可证。在
有关详细信息,请查看LICENSE-文件。在
入门
通过pip/pipenv/poetry将shylock添加到项目中
# MongoDB asyncio pip install shylock[motor]# MongoDB pip install shylock[pymongo]# ArangoDB asyncio pip install shylock[aioarangodb]# ArangoDB pip install shylock[python-arango]
为了最容易使用,您应该在应用程序启动逻辑中为夏洛克配置默认后端,然后使用AsyncLock类来处理您的锁定需求。在
^{pr2}$或者是不需要asyncio支持的代码的Lock类
frompymongoimportMongoClientfromshylockimportconfigure,Lock,ShylockPymongoBackendCONNECTION_STRING="mongodb://your-connection-string"client=MongoClient(CONNECTION_STRING)configure(ShylockPymongoBackend.create(client,"projectdb"))defuse_lock():withLock("my-lock"):# The lock is now acquired, and will be automatically releaseddo_something()defanother_lock_use():lock=Lock("my-lock")try:lock.acquire()do_something()finally:lock.release()deftime_sensitive_code():lock=Lock("my-lock")try:locked=lock.acquire(block=False)iflocked:do_something()finally:iflocked:lock.release()
您还可以查看examples,它还展示了如何在ArangoDB中使用夏洛克。在
贡献
此项目在GitHub上运行,使用此处的问题跟踪和拉取请求。如果你想投稿,请随意在这里submit issues(包括功能请求)或pr。在
在本地测试更改python setup.py develop是一个很好的运行方法,您可以在以后python setup.py develop --uninstall(您可能还需要使用--user标志)。在
- 项目
标签: