Automatic thread safety for classes

C. Barnes connellybarnes at yahoo.com
Thu Jun 17 03:11:42 EDT 2004


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 ubthreadfunction(f):
    def g(self, *args, **kwargs):
      self.lock.acquire()
      ans = f(self, *args, **kwargs)
      self.lock.release()
      return ans
    return g

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


Example:

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

SafeCounter = threadclass(Counter)


Now SafeCounter is a threadsafe class.  Try it out!

Enjoy,
Connelly Barnes



	
		
__________________________________
Do you Yahoo!?
New and Improved Yahoo! Mail - 100MB free storage!
http://promotions.yahoo.com/new_mail 




More information about the Python-list mailing list