Add a few usage examples for lockutils
There was a complaint that the usage examples in oslo.concurrency are lacking (which they are) so this addresses some of those concerns by adding a few usage examples (and descriptions). Change-Id: I0738b898f1235e83a600c7732d70058b3fd3860f
This commit is contained in:
parent
7cd7883936
commit
cbdf411306
@ -6,11 +6,62 @@ To use oslo.concurrency in a project, import the relevant module. For
|
|||||||
example::
|
example::
|
||||||
|
|
||||||
from oslo_concurrency import lockutils
|
from oslo_concurrency import lockutils
|
||||||
|
from oslo_concurrency import processutils
|
||||||
|
|
||||||
.. seealso::
|
.. seealso::
|
||||||
|
|
||||||
* :doc:`API Documentation <api/index>`
|
* :doc:`API Documentation <api/index>`
|
||||||
|
|
||||||
|
Locking a function (local to a process)
|
||||||
|
=======================================
|
||||||
|
|
||||||
|
To ensure that a function (which is not thread safe) is only used in
|
||||||
|
a thread safe manner (typically such type of function should be refactored
|
||||||
|
to avoid this problem but if not then the following can help)::
|
||||||
|
|
||||||
|
@lockutils.synchronized('not_thread_safe')
|
||||||
|
def not_thread_safe():
|
||||||
|
pass
|
||||||
|
|
||||||
|
Once decorated later callers of this function will be able to call into
|
||||||
|
this method and the contract that two threads will **not** enter this
|
||||||
|
function at the same time will be upheld. Make sure that the names of the
|
||||||
|
locks used are carefully chosen (typically by namespacing them to your
|
||||||
|
app so that other apps will not chose the same names).
|
||||||
|
|
||||||
|
Locking a function (local to a process as well as across process)
|
||||||
|
=================================================================
|
||||||
|
|
||||||
|
To ensure that a function (which is not thread safe **or** multi-process
|
||||||
|
safe) is only used in a safe manner (typically such type of function should
|
||||||
|
be refactored to avoid this problem but if not then the following can help)::
|
||||||
|
|
||||||
|
@lockutils.synchronized('not_thread_process_safe', external=True)
|
||||||
|
def not_thread_process_safe():
|
||||||
|
pass
|
||||||
|
|
||||||
|
Once decorated later callers of this function will be able to call into
|
||||||
|
this method and the contract that two threads (or any two processes)
|
||||||
|
will **not** enter this function at the same time will be upheld. Make
|
||||||
|
sure that the names of the locks used are carefully chosen (typically by
|
||||||
|
namespacing them to your app so that other apps will not chose the same
|
||||||
|
names).
|
||||||
|
|
||||||
|
Common ways to prefix/namespace the synchronized decorator
|
||||||
|
==========================================================
|
||||||
|
|
||||||
|
Since it is **highly** recommended to prefix (or namespace) the usage
|
||||||
|
of the synchronized there are a few helpers that can make this much easier
|
||||||
|
to achieve.
|
||||||
|
|
||||||
|
An example is::
|
||||||
|
|
||||||
|
myapp_synchronized = lockutils.synchronized_with_prefix("myapp")
|
||||||
|
|
||||||
|
Then further usage of the ``lockutils.synchronized`` would instead now use
|
||||||
|
this decorator created above instead of using ``lockutils.synchronized``
|
||||||
|
directly.
|
||||||
|
|
||||||
Command Line Wrapper
|
Command Line Wrapper
|
||||||
====================
|
====================
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user