- Author:
- mwolgemuth
- Posted:
- January 23, 2009
- Language:
- Python
- Version:
- 1.0
- Score:
- 1 (after 1 ratings)
This decorator allows you to wrap class methods or module functions and synchronize access to them. It maintains a dict of locks with a key for each unique name of combined module name and method name. (Implementing class name is lost in decorator? Otherwise it would have class name too if available.)
Effectively it functions as a class level method synchronizer, with the lock handling completely hidden from the wrapped function.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | from threading import Lock
_lock_table_lock = Lock()
_lock_table = {}
# decorate drops method attributes like .im_class? bleah
def synchronized_module_function():
""" Synchronization decorator. """
def decorate(f):
def new_func(*args, **kw):
lock = _get_lock_for_method(f)
lock.acquire()
try:
return f(*args, **kw)
finally:
lock.release()
return new_func
return decorate
def _get_lock_for_method(f):
# key from module class is from, func name -- would like class name but not available?
_lock_table_lock.acquire()
try:
key = "%s%s" % (f.__module__, f.__name__)
lock = None
try:
lock = _lock_table[key]
except KeyError:
lock = _lock_table[key] = Lock()
finally:
_lock_table_lock.release()
return lock
|
More like this
- Template tag - list punctuation for a list of items by shapiromatron 10 months, 2 weeks ago
- JSONRequestMiddleware adds a .json() method to your HttpRequests by cdcarter 10 months, 3 weeks ago
- Serializer factory with Django Rest Framework by julio 1 year, 5 months ago
- Image compression before saving the new model / work with JPG, PNG by Schleidens 1 year, 6 months ago
- Help text hyperlinks by sa2812 1 year, 6 months ago
Comments
Please login first before commenting.