title: With statement and python threading
body: <p>I am a noob in python trying to understand the threading module.
  I am using python 2.7.One of the motivation for with_statement in python was given to be code pattern of </p>
  
  <pre><code>with threading.Lock():
          //User defined function in a new thread
  </code></pre>
  
  <p>I am not sure if I have understood it correctly but my initial assumption is this code should aquire a lock on mainthread  which is released once the child threads are complete.
  Yet this script</p>
  
  <pre><code>from __future__ import print_function
  import threading
  import time
  import functools
  #import contextlib
  #Thread module for dealing with lower level thread operations.Thread is limited use Threading instead.
  
  def timeit(fn):
      '''Timeit function like this doesnot work with the thread calls'''
      def wrapper(*args,**kwargs):
          start = time.time()
          fn(*args,**kwargs)
          end = time.time()
          threadID = ""
          print ("Duration for func %s :%d\n"%(fn.__name__ +"_"+ threading.current_thread().name ,end-start))
      return wrapper
  
  exitFlag = 0
  
  @timeit
  def print_time(counter,delay):
      while counter:
          if exitFlag:
              thread.exit()
          time.sleep(delay)
          print("%s : %s_%d"%(threading.current_thread().name,time.ctime(time.time()),counter))
          counter -= 1
  
  class Mythread(threading.Thread):
      def __init__(self,threadID,name,counter,delay):
          threading.Thread.__init__(self)
          self.threadID = threadID
          self.name = name
          self.counter = counter
          self.delay = delay
  
      def run(self):
          print("Starting%s\n" % self.name)
          print_time(self.counter, self.delay)
          print("Exiting%s\n" % self.name)
  
  
  if __name__ == '__main__':
      '''
      print_time(5, 1)
       threadLock = threading.Lock()
       threads = []
       thread1 = Mythread(1,"Thread1",5,1)
       thread2 = Mythread(2,"Thread2",5,2)
       thread1.start()
       thread2.start()
       threads.append(thread1)
       threads.append(thread2)
       for t in threads:
           t.join()
      '''
      thread1 = Mythread(1,"Thread1",5,1)
      thread2 = Mythread(2,"Thread2",5,2)
      lock = threading.Lock()
      with lock:
          thread1.start()
          thread2.start()
  
      print("Exiting main thread ")
  </code></pre>
  
  <p>Produces following output:</p>
  
  <pre><code>StartingThread1
  
  StartingThread2
  
  Exiting main thread 
  Thread1 : Sat May 04 02:21:54 2013_5
  Thread1 : Sat May 04 02:21:55 2013_4
  Thread2 : Sat May 04 02:21:55 2013_5
  Thread1 : Sat May 04 02:21:56 2013_3
  Thread1 : Sat May 04 02:21:57 2013_2
  Thread2 : Sat May 04 02:21:57 2013_4
  Thread1 : Sat May 04 02:21:58 2013_1
  Duration for func print_time_Thread1 :5
  
  ExitingThread1
  
  Thread2 : Sat May 04 02:21:59 2013_3
  Thread2 : Sat May 04 02:22:01 2013_2
  Thread2 : Sat May 04 02:22:03 2013_1
  Duration for func print_time_Thread2 :10
  
  ExitingThread2
  </code></pre>
  
  <p>Please help me understand why the locking doesnot work with the with_statement like this or have I completely misunderstood the concept.I am confused why I get directly to print("Exiting main thread") even by defining a lock</p>