oslo_concurrency.lockutils
¶
- exception oslo_concurrency.lockutils.AcquireLockFailedException(lock_name)¶
Bases:
Exception
- class oslo_concurrency.lockutils.FairLocks¶
Bases:
object
A garbage collected container of fair locks.
With a fair lock, contending lockers will get the lock in the order in which they tried to acquire it.
This collection internally uses a weak value dictionary so that when a lock is no longer in use (by any threads) it will automatically be removed from this container by the garbage collector.
- get(name)¶
Gets (or creates) a lock with a given name.
- Parameters:
name – The lock name to get/create (used to associate previously created names with the same lock).
Returns an newly constructed lock (or an existing one if it was already created for the given name).
- class oslo_concurrency.lockutils.ReaderWriterLock(*args, **kwargs)¶
Bases:
ReaderWriterLock
A reader/writer lock.
Added in version 0.4.
- class oslo_concurrency.lockutils.Semaphores¶
Bases:
object
A garbage collected container of semaphores.
This collection internally uses a weak value dictionary so that when a semaphore is no longer in use (by any threads) it will automatically be removed from this container by the garbage collector.
Added in version 0.3.
- get(name)¶
Gets (or creates) a semaphore with a given name.
- Parameters:
name – The semaphore name to get/create (used to associate previously created names with the same semaphore).
Returns an newly constructed semaphore (or an existing one if it was already created for the given name).
- oslo_concurrency.lockutils.external_lock(name, lock_file_prefix=None, lock_path=None)¶
- oslo_concurrency.lockutils.get_lock_path(conf)¶
Return the path used for external file-based locks.
- Parameters:
conf (oslo_config.cfg.ConfigOpts) – Configuration object
Added in version 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)¶
Context based lock
This function yields a threading.Semaphore instance (if we don’t use eventlet.monkey_patch(), else semaphore.Semaphore) unless external is True, in which case, it’ll yield an InterProcessLock instance.
- Parameters:
lock_file_prefix – The lock_file_prefix argument is used to provide lock files on disk with a meaningful prefix.
external – The external keyword argument denotes whether this lock should work across multiple processes. This means that if two different workers both run a method decorated with @synchronized(‘mylock’, external=True), only one of them will execute at a time.
lock_path – The path in which to store external lock files. For external locking to work properly, this must be the same for all references to the lock.
do_log – Whether to log acquire/release messages. This is primarily intended to reduce log message duplication when lock is used from the synchronized decorator.
semaphores – Container that provides semaphores to use when locking. This ensures that threads inside the same application can not collide, due to the fact that external process locks are unaware of a processes active threads.
delay – Delay between acquisition attempts (in seconds).
fair – Whether or not we want a “fair” lock where contending lockers will get the lock in the order in which they tried to acquire it.
blocking – Whether to wait forever to try to acquire the lock. Incompatible with fair locks because those provided by the fasteners module doesn’t implements a non-blocking behavior.
Changed in version 0.2: Added do_log optional parameter.
Changed in version 0.3: Added delay and semaphores optional parameters.
- oslo_concurrency.lockutils.lock_with_prefix(lock_file_prefix)¶
Partial object generator for the lock context manager.
Redefine lock in each project like so:
(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'): ...
Eventually clean up with:
lock_cleanup('mylock')
- Parameters:
lock_file_prefix – A string used to provide lock files on disk with a meaningful prefix. Will be separated from the lock name with a hyphen, which may optionally be included in the lock_file_prefix (e.g.
'nova'
and'nova-'
are equivalent).
- oslo_concurrency.lockutils.main()¶
- oslo_concurrency.lockutils.remove_external_lock_file(name, lock_file_prefix=None, lock_path=None, semaphores=None)¶
Remove an external lock file when it’s not used anymore This will be helpful when we have a lot of lock files
- oslo_concurrency.lockutils.remove_external_lock_file_with_prefix(lock_file_prefix)¶
Partial object generator for the remove lock file function.
Redefine remove_external_lock_file_with_prefix in each project like so:
(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>
The lock_file_prefix argument is used to provide lock files on disk with a meaningful prefix.
- oslo_concurrency.lockutils.set_defaults(lock_path)¶
Set value for lock_path.
This can be used by tests to set lock_path to a temporary directory.
- oslo_concurrency.lockutils.synchronized(name, lock_file_prefix=None, external=False, lock_path=None, semaphores=None, delay=0.01, fair=False, blocking=True)¶
Synchronization decorator.
Decorating a method like so:
@synchronized('mylock') def foo(self, *args): ...
ensures that only one thread will execute the foo method at a time.
Different methods can share the same lock:
@synchronized('mylock') def foo(self, *args): ... @synchronized('mylock') def bar(self, *args): ...
This way only one of either foo or bar can be executing at a time.
Changed in version 0.3: Added delay and semaphores optional parameter.
- oslo_concurrency.lockutils.synchronized_with_prefix(lock_file_prefix)¶
Partial object generator for the synchronization decorator.
Redefine @synchronized in each project like so:
(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): ...
Eventually clean up with:
lock_cleanup('mylock')
- Parameters:
lock_file_prefix – A string used to provide lock files on disk with a meaningful prefix. Will be separated from the lock name with a hyphen, which may optionally be included in the lock_file_prefix (e.g.
'nova'
and'nova-'
are equivalent).