可选择后端的分布式进程间锁。

sherlock的Python项目详细描述


Sherlock是一个提供易于使用的分布式进程间 锁定,还允许您为锁定选择后端 同步。

Build StatusCoverage Status

概述

当您使用由多个服务或 分布式服务,通常需要某种锁定机制 使一次访问某些资源成为可能。

分布式锁或互斥锁可以帮助您实现这一点。夏洛克提供 完全一样的设施,还有一些额外的东西。它提供了一个易于使用的api 类似于标准库的threading.lock语义。

除此之外,Sherlock还提供了使用后端的灵活性。 您管理锁的选择。

Sherlock还使您可以简单地扩展Sherlock以使用 不支持的后端。

功能

  • 类似于标准库的threading.lock。
  • 支持WITH语句,以干净地获取和释放锁。
  • 后端不可知:支持RedisMemcachedEtcd作为选项 后端。
  • 可扩展:可以很容易地扩展到与 通过扩展基锁类进行选择。读取extending

支持的后端和客户端库

每个支持的后端都支持以下客户端库:

截至目前,仅支持上述库。尽管 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

路线图

许可证

LICENSE

^ {STR 1 } $简称:这是一个开源项目,任何人都可以使用它 和/或修改以供个人使用。只是要友善点,把功劳归于 无论你在哪里。:)


热门话题
maven字段#getGenericType()抛出java。lang.TypeNotPresentException   用java绘制三角形的几何图形   java无法下载主题和发件人地址(rediff)   java如何使代码线程安全   java在尝试转换FileInputStream中的文件时,我遇到了一个FileNotFound异常   java Moxy和Jackson如何将Json映射到Pojo   在foreach循环中使用BufferedWriter生成新行的java问题   java为什么我的测试在单次执行中运行时间小于1秒,而在maven构建中运行时间大于20秒?   java如何显示下载附件的进度条   了解java rmi的良好实践   .net可以将Java portlet嵌入ASP。网页?   循环如何多次执行Java方法?   java如何确保用户输入在给定的有效范围内?   java单元测试定理   java如何在IntelliJ上运行外部构建项目?   JAVA:试图编写一个检查字符串是否为数字的方法。总是返回错误   javahadoop将特定键的所有map方法生成的所有值都发送到一个reduce方法,对吗?   在java中读取和使用文件