#!/usr/bin/env python class ThreadingUtility: # Assumes class has instance lock initialized @classmethod def synchronize(cls, func): def synchronized(*args, **kwargs): im_self = args[0] im_self.lock.acquire() try: result = func(*args, **kwargs) return result finally: im_self.lock.release() return synchronized ####################################################################### # Testing. if __name__ == '__main__': import threading class A: def __init__(self): self.lock = threading.RLock() @ThreadingUtility.synchronize def twoX(self, x): print 'X=', x return 2*x a = A() t = a.twoX(3) print 'Result: ', t