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 中更改:添加了 delaysemaphores 可选参数。

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 中更改:添加了 delaysemaphores 可选参数。

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-' 是等效的)。