# -*- coding: iso-8859-1 -*- # # synchronized objects and methods. # By André Bjärby # From http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/65202 # from types import * def _get_method_names (obj): if type(obj) == InstanceType: return _get_method_names(obj.__class__) elif type(obj) == ClassType: result = [] for name, func in obj.__dict__.items(): if type(func) == FunctionType: result.append((name, func)) for base in obj.__bases__: result.extend(_get_method_names(base)) return result class _SynchronizedMethod: def __init__ (self, method, obj, lock): self.__method = method self.__obj = obj self.__lock = lock def __call__ (self, *args, **kwargs): self.__lock.acquire() try: #print 'Calling method %s from obj %s' % (self.__method, self.__obj) return self.__method(self.__obj, *args, **kwargs) finally: self.__lock.release() class SynchronizedObject: def __init__ (self, obj, ignore=[], lock=None): import threading self.__methods = {} self.__obj = obj lock = lock and lock or threading.RLock() for name, method in _get_method_names(obj): if not name in ignore: self.__methods[name] = _SynchronizedMethod(method, obj, lock) def __getattr__ (self, name): try: return self.__methods[name] except KeyError: return getattr(self.__obj, name)