Automatic thread safety for classes

Collapse
This topic is closed.
X
X
 
  • Time
  • Show
Clear All
new posts
  • C. Barnes

    Automatic thread safety for classes


    Another useful code snippet...

    This allows you to take a non-threadsafe class, and
    automatically generate a threadsafe class. When a
    method is called for your class, it automatically
    locks the object, then calls the method, then unlocks
    the object. You will have to perform any further
    locking/unlocking manually.

    # -------------------------------------------------
    # threadclass: Get a threadsafe copy of a class.
    # -------------------------------------------------

    import types, threading
    def threadclass(C):
    """Returns a 'threadsafe' copy of class C.
    All public methods are modified to lock the
    object when called."""
    class D(C):
    def __init__(self):
    self.lock = threading.RLock ()
    C.__init__(self )

    def ubthreadfunctio n(f):
    def g(self, *args, **kwargs):
    self.lock.acqui re()
    ans = f(self, *args, **kwargs)
    self.lock.relea se()
    return ans
    return g

    for a in dir(D):
    f = getattr(D, a)
    if isinstance(f, types.UnboundMe thodType) and
    a[:2] != '__':
    setattr(D, a, ubthreadfunctio n(f))
    return D


    Example:

    class Counter:
    def __init__(self):
    self.val = 0
    def increment(self) :
    self.val += 1

    SafeCounter = threadclass(Cou nter)


    Now SafeCounter is a threadsafe class. Try it out!

    Enjoy,
    Connelly Barnes





    _______________ _______________ ____
    Do you Yahoo!?
    New and Improved Yahoo! Mail - 100MB free storage!
    Shop the best deals at Yahoo! Shopping! Discover discounts on a wide range of products, from electronics to fashion, and enjoy exclusive offers. Save big with top deals today!


  • Connelly Barnes

    #2
    Re: Automatic thread safety for classes (fixed bug w/ exceptions)

    To properly handle exceptions, the code in the previous posting should
    be modified to include a try...finally block:

    def ubthreadfunctio n(f):
    def g(self, *args, **kwargs):
    try:
    self.lock.acqui re()
    ans = f(self, *args, **kwargs)
    finally:
    self.lock.relea se()
    return ans
    return g

    - Connelly

    Comment

    Working...