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