oslo_concurrency.lockutils¶
- 异常 oslo_concurrency.lockutils.AcquireLockFailedException(lock_name)¶
基础:
Exception
- 类 oslo_concurrency.lockutils.FairLocks¶
基类:
object一个垃圾回收的公平锁容器。
使用公平锁时,竞争的加锁者将按照他们尝试获取锁的顺序获得锁。
此集合内部使用弱值字典,以便当锁不再被使用(任何线程)时,它将自动从该容器中被垃圾回收器删除。
- get(name)¶
获取(或创建)具有给定名称的锁。
- 参数:
name – 要获取/创建的锁名称(用于将先前创建的名称与相同的锁关联)。
返回一个新创建的锁(如果该名称已经创建了锁,则返回现有锁)。
- 类 oslo_concurrency.lockutils.ReaderWriterLock(*args, **kwargs)¶
基类:
ReaderWriterLock一个读写锁。
在版本 0.4 中添加。
- 类 oslo_concurrency.lockutils.Semaphores¶
基类:
object一个垃圾回收的信号量容器。
此集合内部使用弱值字典,以便当信号量不再被使用(任何线程)时,它将自动从该容器中被垃圾回收器删除。
在 0.3 版本中添加。
- get(name)¶
获取(或创建)具有给定名称的信号量。
- 参数:
name – 要获取/创建的信号量名称(用于将先前创建的名称与相同的信号量关联)。
返回一个新创建的信号量(如果该名称已经创建了信号量,则返回现有信号量)。
- oslo_concurrency.lockutils.external_lock(name, lock_file_prefix=None, lock_path=None)¶
- oslo_concurrency.lockutils.get_lock_path(conf)¶
返回用于外部文件锁的路径。
- 参数:
conf (oslo_config.cfg.ConfigOpts) – 配置对象
在版本 1.8 中添加。
- oslo_concurrency.lockutils.internal_fair_lock(name)¶
- oslo_concurrency.lockutils.internal_lock(name, semaphores=None, blocking=True)¶
- oslo_concurrency.lockutils.lock(name, lock_file_prefix=None, external=False, lock_path=None, do_log=True, semaphores=None, delay=0.01, fair=False, blocking=True)¶
基于上下文的锁
除非 external 为 True,否则此函数将产生一个 threading.Semaphore 实例(如果我们不使用 eventlet.monkey_patch(),否则 semaphore.Semaphore),否则将产生一个 InterProcessLock 实例。
- 参数:
lock_file_prefix – lock_file_prefix 参数用于为磁盘上的锁文件提供有意义的前缀。
external – external 关键字参数表示此锁是否应跨多个进程工作。这意味着如果两个不同的 worker 都运行一个用 @synchronized(‘mylock’, external=True) 装饰的方法,则只有一个 worker 会执行。
lock_path – 存储外部锁文件的路径。为了使外部锁定正常工作,这对于所有对锁的引用都必须相同。
do_log – 是否记录获取/释放消息。这主要用于减少从 synchronized 装饰器使用的 lock 产生的日志消息重复。
semaphores – 提供用于锁定时使用的信号量的容器。这确保了同一应用程序内的线程不会发生冲突,因为外部进程锁不知道进程的活动线程。
delay – 尝试获取锁之间的延迟(秒)。
fair – 我们是否想要一个“公平”锁,其中竞争的加锁者将按照他们尝试获取锁的顺序获得锁。
blocking – 是否永久等待尝试获取锁。与公平锁不兼容,因为 fasteners 模块提供的那些锁不实现非阻塞行为。
版本 0.2 中更改:添加了 do_log 可选参数。
版本 0.3 中更改:添加了 delay 和 semaphores 可选参数。
- oslo_concurrency.lockutils.lock_with_prefix(lock_file_prefix)¶
锁上下文管理器的部分对象生成器。
在每个项目中以如下方式重新定义 lock
(in nova/utils.py) from oslo_concurrency import lockutils _prefix = 'nova' lock = lockutils.lock_with_prefix(_prefix) lock_cleanup = lockutils.remove_external_lock_file_with_prefix(_prefix) (in nova/foo.py) from nova import utils with utils.lock('mylock'): ...
最终使用以下方式清理
lock_cleanup('mylock')
- 参数:
lock_file_prefix – 用于为磁盘上的锁文件提供有意义的前缀的字符串。它将与锁名称用连字符分隔,这可以包含在 lock_file_prefix 中(例如,
'nova'和'nova-'是等效的)。
- oslo_concurrency.lockutils.main()¶
- oslo_concurrency.lockutils.remove_external_lock_file(name, lock_file_prefix=None, lock_path=None, semaphores=None)¶
删除不再使用的外部锁文件。当有很多锁文件时,这将很有帮助
- oslo_concurrency.lockutils.remove_external_lock_file_with_prefix(lock_file_prefix)¶
删除锁文件的函数的部分对象生成器。
在每个项目中以如下方式重新定义 remove_external_lock_file_with_prefix
(in nova/utils.py) from oslo_concurrency import lockutils _prefix = 'nova' synchronized = lockutils.synchronized_with_prefix(_prefix) lock = lockutils.lock_with_prefix(_prefix) lock_cleanup = lockutils.remove_external_lock_file_with_prefix(_prefix) (in nova/foo.py) from nova import utils @utils.synchronized('mylock') def bar(self, *args): ... def baz(self, *args): ... with utils.lock('mylock'): ... ... <eventually call lock_cleanup('mylock') to clean up>
lock_file_prefix 参数用于为磁盘上的锁文件提供有意义的前缀。
- oslo_concurrency.lockutils.set_defaults(lock_path)¶
设置 lock_path 的值。
这可用于测试,以将 lock_path 设置为临时目录。
- oslo_concurrency.lockutils.synchronized(name, lock_file_prefix=None, external=False, lock_path=None, semaphores=None, delay=0.01, fair=False, blocking=True)¶
同步装饰器。
像这样装饰一个方法
@synchronized('mylock') def foo(self, *args): ...
确保只有一个线程会一次执行 foo 方法。
不同的方法可以共享同一个锁
@synchronized('mylock') def foo(self, *args): ... @synchronized('mylock') def bar(self, *args): ...
这样,foo 或 bar 中只有一个可以同时执行。
版本 0.3 中更改:添加了 delay 和 semaphores 可选参数。
- oslo_concurrency.lockutils.synchronized_with_prefix(lock_file_prefix)¶
同步装饰器的部分对象生成器。
在每个项目中以如下方式重新定义 @synchronized
(in nova/utils.py) from oslo_concurrency import lockutils _prefix = 'nova' synchronized = lockutils.synchronized_with_prefix(_prefix) lock_cleanup = lockutils.remove_external_lock_file_with_prefix(_prefix) (in nova/foo.py) from nova import utils @utils.synchronized('mylock') def bar(self, *args): ...
最终使用以下方式清理
lock_cleanup('mylock')
- 参数:
lock_file_prefix – 用于为磁盘上的锁文件提供有意义的前缀的字符串。它将与锁名称用连字符分隔,这可以包含在 lock_file_prefix 中(例如,
'nova'和'nova-'是等效的)。