home *** CD-ROM | disk | FTP | other *** search
/ Maximum CD 2012 January / maximum-cd-2012-01.iso / DiscContents / digsby_setup.exe / lib / threading.pyo (.txt) < prev    next >
Encoding:
Python Compiled Bytecode  |  2011-10-05  |  22.8 KB  |  887 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyo (Python 2.6)
  3.  
  4. import sys as _sys
  5.  
  6. try:
  7.     import thread
  8. except ImportError:
  9.     del _sys.modules[__name__]
  10.     raise 
  11.  
  12. import warnings
  13. from functools import wraps
  14. from time import time as _time, sleep as _sleep
  15. from traceback import format_exc as _format_exc
  16. from collections import deque
  17. __all__ = [
  18.     'activeCount',
  19.     'active_count',
  20.     'Condition',
  21.     'currentThread',
  22.     'current_thread',
  23.     'enumerate',
  24.     'Event',
  25.     'Lock',
  26.     'RLock',
  27.     'Semaphore',
  28.     'BoundedSemaphore',
  29.     'Thread',
  30.     'Timer',
  31.     'setprofile',
  32.     'settrace',
  33.     'local',
  34.     'stack_size']
  35. _start_new_thread = thread.start_new_thread
  36. _allocate_lock = thread.allocate_lock
  37. _get_ident = thread.get_ident
  38. ThreadError = thread.error
  39. del thread
  40. warnings.filterwarnings('ignore', category = DeprecationWarning, module = 'threading', message = 'sys.exc_clear')
  41. _VERBOSE = False
  42.  
  43. class _Verbose(object):
  44.     
  45.     def __init__(self, verbose = None):
  46.         pass
  47.  
  48.     
  49.     def _note(self, *args):
  50.         pass
  51.  
  52.  
  53. _profile_hook = None
  54. _trace_hook = None
  55.  
  56. def setprofile(func):
  57.     global _profile_hook
  58.     _profile_hook = func
  59.  
  60.  
  61. def settrace(func):
  62.     global _trace_hook
  63.     _trace_hook = func
  64.  
  65. Lock = _allocate_lock
  66.  
  67. def RLock(*args, **kwargs):
  68.     return _RLock(*args, **kwargs)
  69.  
  70.  
  71. class _RLock(_Verbose):
  72.     
  73.     def __init__(self, verbose = None):
  74.         _Verbose.__init__(self, verbose)
  75.         self._RLock__block = _allocate_lock()
  76.         self._RLock__owner = None
  77.         self._RLock__count = 0
  78.  
  79.     
  80.     def __repr__(self):
  81.         owner = self._RLock__owner
  82.         if owner:
  83.             pass
  84.         return '<%s(%s, %d)>' % (self.__class__.__name__, owner.name, self._RLock__count)
  85.  
  86.     
  87.     def acquire(self, blocking = 1):
  88.         me = current_thread()
  89.         if self._RLock__owner is me:
  90.             self._RLock__count = self._RLock__count + 1
  91.             return 1
  92.         rc = self._RLock__block.acquire(blocking)
  93.         if rc:
  94.             self._RLock__owner = me
  95.             self._RLock__count = 1
  96.         
  97.         return rc
  98.  
  99.     __enter__ = acquire
  100.     
  101.     def release(self):
  102.         if self._RLock__owner is not current_thread():
  103.             raise RuntimeError('cannot release un-aquired lock')
  104.         self._RLock__owner is not current_thread()
  105.         self._RLock__count = count = self._RLock__count - 1
  106.         if not count:
  107.             self._RLock__owner = None
  108.             self._RLock__block.release()
  109.         
  110.  
  111.     
  112.     def __exit__(self, t, v, tb):
  113.         self.release()
  114.  
  115.     
  116.     def _acquire_restore(self, count_owner):
  117.         (count, owner) = count_owner
  118.         self._RLock__block.acquire()
  119.         self._RLock__count = count
  120.         self._RLock__owner = owner
  121.  
  122.     
  123.     def _release_save(self):
  124.         count = self._RLock__count
  125.         self._RLock__count = 0
  126.         owner = self._RLock__owner
  127.         self._RLock__owner = None
  128.         self._RLock__block.release()
  129.         return (count, owner)
  130.  
  131.     
  132.     def _is_owned(self):
  133.         return self._RLock__owner is current_thread()
  134.  
  135.  
  136.  
  137. def Condition(*args, **kwargs):
  138.     return _Condition(*args, **kwargs)
  139.  
  140.  
  141. class _Condition(_Verbose):
  142.     
  143.     def __init__(self, lock = None, verbose = None):
  144.         _Verbose.__init__(self, verbose)
  145.         if lock is None:
  146.             lock = RLock()
  147.         
  148.         self._Condition__lock = lock
  149.         self.acquire = lock.acquire
  150.         self.release = lock.release
  151.         
  152.         try:
  153.             self._release_save = lock._release_save
  154.         except AttributeError:
  155.             pass
  156.  
  157.         
  158.         try:
  159.             self._acquire_restore = lock._acquire_restore
  160.         except AttributeError:
  161.             pass
  162.  
  163.         
  164.         try:
  165.             self._is_owned = lock._is_owned
  166.         except AttributeError:
  167.             pass
  168.  
  169.         self._Condition__waiters = []
  170.  
  171.     
  172.     def __enter__(self):
  173.         return self._Condition__lock.__enter__()
  174.  
  175.     
  176.     def __exit__(self, *args):
  177.         return self._Condition__lock.__exit__(*args)
  178.  
  179.     
  180.     def __repr__(self):
  181.         return '<Condition(%s, %d)>' % (self._Condition__lock, len(self._Condition__waiters))
  182.  
  183.     
  184.     def _release_save(self):
  185.         self._Condition__lock.release()
  186.  
  187.     
  188.     def _acquire_restore(self, x):
  189.         self._Condition__lock.acquire()
  190.  
  191.     
  192.     def _is_owned(self):
  193.         if self._Condition__lock.acquire(0):
  194.             self._Condition__lock.release()
  195.             return False
  196.         return True
  197.  
  198.     
  199.     def wait(self, timeout = None):
  200.         if not self._is_owned():
  201.             raise RuntimeError('cannot wait on un-aquired lock')
  202.         self._is_owned()
  203.         waiter = _allocate_lock()
  204.         waiter.acquire()
  205.         self._Condition__waiters.append(waiter)
  206.         saved_state = self._release_save()
  207.         
  208.         try:
  209.             if timeout is None:
  210.                 waiter.acquire()
  211.             else:
  212.                 endtime = _time() + timeout
  213.                 delay = 0.0005
  214.                 while True:
  215.                     gotit = waiter.acquire(0)
  216.                     if gotit:
  217.                         break
  218.                     
  219.                     remaining = endtime - _time()
  220.                     if remaining <= 0:
  221.                         break
  222.                     
  223.                     delay = min(delay * 2, remaining, 0.05)
  224.                     _sleep(delay)
  225.                 if not gotit:
  226.                     
  227.                     try:
  228.                         self._Condition__waiters.remove(waiter)
  229.                     except ValueError:
  230.                         pass
  231.                     except:
  232.                         None<EXCEPTION MATCH>ValueError
  233.                     
  234.  
  235.                 None<EXCEPTION MATCH>ValueError
  236.         finally:
  237.             self._acquire_restore(saved_state)
  238.  
  239.  
  240.     
  241.     def notify(self, n = 1):
  242.         if not self._is_owned():
  243.             raise RuntimeError('cannot notify on un-aquired lock')
  244.         self._is_owned()
  245.         _Condition__waiters = self._Condition__waiters
  246.         waiters = _Condition__waiters[:n]
  247.         if not waiters:
  248.             return None
  249.         if not n != 1 or 's':
  250.             pass
  251.         self._note('%s.notify(): notifying %d waiter%s', self, n, '')
  252.         for waiter in waiters:
  253.             waiter.release()
  254.             
  255.             try:
  256.                 _Condition__waiters.remove(waiter)
  257.             continue
  258.             except ValueError:
  259.                 waiters
  260.                 waiters
  261.                 continue
  262.             
  263.  
  264.         
  265.  
  266.     
  267.     def notifyAll(self):
  268.         self.notify(len(self._Condition__waiters))
  269.  
  270.     notify_all = notifyAll
  271.  
  272.  
  273. def Semaphore(*args, **kwargs):
  274.     return _Semaphore(*args, **kwargs)
  275.  
  276.  
  277. class _Semaphore(_Verbose):
  278.     
  279.     def __init__(self, value = 1, verbose = None):
  280.         if value < 0:
  281.             raise ValueError('semaphore initial value must be >= 0')
  282.         value < 0
  283.         _Verbose.__init__(self, verbose)
  284.         self._Semaphore__cond = Condition(Lock())
  285.         self._Semaphore__value = value
  286.  
  287.     
  288.     def acquire(self, blocking = 1):
  289.         rc = False
  290.         self._Semaphore__cond.acquire()
  291.         while self._Semaphore__value == 0:
  292.             if not blocking:
  293.                 break
  294.             
  295.             self._Semaphore__cond.wait()
  296.         self._Semaphore__value = self._Semaphore__value - 1
  297.         rc = True
  298.         self._Semaphore__cond.release()
  299.         return rc
  300.  
  301.     __enter__ = acquire
  302.     
  303.     def release(self):
  304.         self._Semaphore__cond.acquire()
  305.         self._Semaphore__value = self._Semaphore__value + 1
  306.         self._Semaphore__cond.notify()
  307.         self._Semaphore__cond.release()
  308.  
  309.     
  310.     def __exit__(self, t, v, tb):
  311.         self.release()
  312.  
  313.  
  314.  
  315. def BoundedSemaphore(*args, **kwargs):
  316.     return _BoundedSemaphore(*args, **kwargs)
  317.  
  318.  
  319. class _BoundedSemaphore(_Semaphore):
  320.     
  321.     def __init__(self, value = 1, verbose = None):
  322.         _Semaphore.__init__(self, value, verbose)
  323.         self._initial_value = value
  324.  
  325.     
  326.     def release(self):
  327.         if self._Semaphore__value >= self._initial_value:
  328.             raise ValueError, 'Semaphore released too many times'
  329.         self._Semaphore__value >= self._initial_value
  330.         return _Semaphore.release(self)
  331.  
  332.  
  333.  
  334. def Event(*args, **kwargs):
  335.     return _Event(*args, **kwargs)
  336.  
  337.  
  338. class _Event(_Verbose):
  339.     
  340.     def __init__(self, verbose = None):
  341.         _Verbose.__init__(self, verbose)
  342.         self._Event__cond = Condition(Lock())
  343.         self._Event__flag = False
  344.  
  345.     
  346.     def isSet(self):
  347.         return self._Event__flag
  348.  
  349.     is_set = isSet
  350.     
  351.     def set(self):
  352.         self._Event__cond.acquire()
  353.         
  354.         try:
  355.             self._Event__flag = True
  356.             self._Event__cond.notify_all()
  357.         finally:
  358.             self._Event__cond.release()
  359.  
  360.  
  361.     
  362.     def clear(self):
  363.         self._Event__cond.acquire()
  364.         
  365.         try:
  366.             self._Event__flag = False
  367.         finally:
  368.             self._Event__cond.release()
  369.  
  370.  
  371.     
  372.     def wait(self, timeout = None):
  373.         self._Event__cond.acquire()
  374.         
  375.         try:
  376.             if not self._Event__flag:
  377.                 self._Event__cond.wait(timeout)
  378.         finally:
  379.             self._Event__cond.release()
  380.  
  381.  
  382.  
  383. _counter = 0
  384.  
  385. def _newname(template = 'Thread-%d'):
  386.     global _counter
  387.     _counter = _counter + 1
  388.     return template % _counter
  389.  
  390. _active_limbo_lock = _allocate_lock()
  391. _active = { }
  392. _limbo = { }
  393.  
  394. class Thread(_Verbose):
  395.     __initialized = False
  396.     __exc_info = _sys.exc_info
  397.     __exc_clear = _sys.exc_clear
  398.     
  399.     def __init__(self, group = None, target = None, name = None, args = (), kwargs = None, verbose = None):
  400.         _Verbose.__init__(self, verbose)
  401.         if kwargs is None:
  402.             kwargs = { }
  403.         
  404.         self._Thread__target = target
  405.         if not name:
  406.             pass
  407.         self._Thread__name = str(_newname())
  408.         self._Thread__args = args
  409.         self._Thread__kwargs = kwargs
  410.         self._Thread__daemonic = self._set_daemon()
  411.         self._Thread__ident = None
  412.         self._Thread__started = Event()
  413.         self._Thread__stopped = False
  414.         self._Thread__block = Condition(Lock())
  415.         self._Thread__initialized = True
  416.         self._Thread__stderr = _sys.stderr
  417.  
  418.     
  419.     def _set_daemon(self):
  420.         return current_thread().daemon
  421.  
  422.     
  423.     def __repr__(self):
  424.         status = 'initial'
  425.         if self._Thread__started.is_set():
  426.             status = 'started'
  427.         
  428.         if self._Thread__stopped:
  429.             status = 'stopped'
  430.         
  431.         if self._Thread__daemonic:
  432.             status += ' daemon'
  433.         
  434.         if self._Thread__ident is not None:
  435.             status += ' %s' % self._Thread__ident
  436.         
  437.         return '<%s(%s, %s)>' % (self.__class__.__name__, self._Thread__name, status)
  438.  
  439.     
  440.     def start(self):
  441.         if not self._Thread__initialized:
  442.             raise RuntimeError('thread.__init__() not called')
  443.         self._Thread__initialized
  444.         if self._Thread__started.is_set():
  445.             raise RuntimeError('thread already started')
  446.         self._Thread__started.is_set()
  447.         _active_limbo_lock.acquire()
  448.         _limbo[self] = self
  449.         _active_limbo_lock.release()
  450.         _start_new_thread(self._Thread__bootstrap, ())
  451.         self._Thread__started.wait()
  452.  
  453.     
  454.     def run(self):
  455.         
  456.         try:
  457.             if self._Thread__target:
  458.                 self._Thread__target(*self._Thread__args, **self._Thread__kwargs)
  459.         finally:
  460.             del self._Thread__target
  461.             del self._Thread__args
  462.             del self._Thread__kwargs
  463.  
  464.  
  465.     
  466.     def __bootstrap(self):
  467.         
  468.         try:
  469.             self._Thread__bootstrap_inner()
  470.         except:
  471.             if self._Thread__daemonic and _sys is None:
  472.                 return None
  473.             raise 
  474.  
  475.  
  476.     
  477.     def _set_ident(self):
  478.         self._Thread__ident = _get_ident()
  479.  
  480.     
  481.     def __bootstrap_inner(self):
  482.         
  483.         try:
  484.             self._set_ident()
  485.             self._Thread__started.set()
  486.             _active_limbo_lock.acquire()
  487.             _active[self._Thread__ident] = self
  488.             del _limbo[self]
  489.             _active_limbo_lock.release()
  490.             if _trace_hook:
  491.                 self._note('%s.__bootstrap(): registering trace hook', self)
  492.                 _sys.settrace(_trace_hook)
  493.             
  494.             if _profile_hook:
  495.                 self._note('%s.__bootstrap(): registering profile hook', self)
  496.                 _sys.setprofile(_profile_hook)
  497.             
  498.             
  499.             try:
  500.                 self.run()
  501.             except SystemExit:
  502.                 pass
  503.             except:
  504.                 if _sys:
  505.                     _sys.stderr.write('Exception in thread %s:\n%s\n' % (self.name, _format_exc()))
  506.                 else:
  507.                     (exc_type, exc_value, exc_tb) = self._Thread__exc_info()
  508.                     
  509.                     try:
  510.                         print >>self._Thread__stderr, 'Exception in thread ' + self.name + ' (most likely raised during interpreter shutdown):'
  511.                         print >>self._Thread__stderr, 'Traceback (most recent call last):'
  512.                         while exc_tb:
  513.                             print >>self._Thread__stderr, '  File "%s", line %s, in %s' % (exc_tb.tb_frame.f_code.co_filename, exc_tb.tb_lineno, exc_tb.tb_frame.f_code.co_name)
  514.                             exc_tb = exc_tb.tb_next
  515.                         print >>self._Thread__stderr, '%s: %s' % (exc_type, exc_value)
  516.                     finally:
  517.                         del exc_type
  518.                         del exc_value
  519.                         del exc_tb
  520.  
  521.             finally:
  522.                 self._Thread__exc_clear()
  523.  
  524.         finally:
  525.             _active_limbo_lock.__enter__()
  526.             
  527.             try:
  528.                 self._Thread__stop()
  529.                 
  530.                 try:
  531.                     del _active[_get_ident()]
  532.                 except:
  533.                     _active_limbo_lock.__exit__
  534.                     _active_limbo_lock
  535.  
  536.             finally:
  537.                 pass
  538.  
  539.  
  540.  
  541.     
  542.     def __stop(self):
  543.         self._Thread__block.acquire()
  544.         self._Thread__stopped = True
  545.         self._Thread__block.notify_all()
  546.         self._Thread__block.release()
  547.  
  548.     
  549.     def __delete(self):
  550.         
  551.         try:
  552.             _active_limbo_lock.__enter__()
  553.             
  554.             try:
  555.                 del _active[_get_ident()]
  556.             finally:
  557.                 pass
  558.  
  559.         except KeyError:
  560.             if 'dummy_threading' not in _sys.modules:
  561.                 raise 
  562.             'dummy_threading' not in _sys.modules
  563.  
  564.  
  565.     
  566.     def join(self, timeout = None):
  567.         if not self._Thread__initialized:
  568.             raise RuntimeError('Thread.__init__() not called')
  569.         self._Thread__initialized
  570.         if not self._Thread__started.is_set():
  571.             raise RuntimeError('cannot join thread before it is started')
  572.         self._Thread__started.is_set()
  573.         if self is current_thread():
  574.             raise RuntimeError('cannot join current thread')
  575.         self is current_thread()
  576.         self._Thread__block.acquire()
  577.         
  578.         try:
  579.             if timeout is None:
  580.                 while not self._Thread__stopped:
  581.                     self._Thread__block.wait()
  582.             else:
  583.                 deadline = _time() + timeout
  584.                 while not self._Thread__stopped:
  585.                     delay = deadline - _time()
  586.                     if delay <= 0:
  587.                         break
  588.                     
  589.                     self._Thread__block.wait(delay)
  590.         finally:
  591.             self._Thread__block.release()
  592.  
  593.  
  594.     
  595.     def name(self):
  596.         return self._Thread__name
  597.  
  598.     name = property(name)
  599.     
  600.     def name(self, name):
  601.         self._Thread__name = str(name)
  602.  
  603.     name = name.setter(name)
  604.     
  605.     def ident(self):
  606.         return self._Thread__ident
  607.  
  608.     ident = property(ident)
  609.     
  610.     def isAlive(self):
  611.         if self._Thread__started.is_set():
  612.             pass
  613.         return not (self._Thread__stopped)
  614.  
  615.     is_alive = isAlive
  616.     
  617.     def daemon(self):
  618.         return self._Thread__daemonic
  619.  
  620.     daemon = property(daemon)
  621.     
  622.     def daemon(self, daemonic):
  623.         if not self._Thread__initialized:
  624.             raise RuntimeError('Thread.__init__() not called')
  625.         self._Thread__initialized
  626.         if self._Thread__started.is_set():
  627.             raise RuntimeError('cannot set daemon status of active thread')
  628.         self._Thread__started.is_set()
  629.         self._Thread__daemonic = daemonic
  630.  
  631.     daemon = daemon.setter(daemon)
  632.     
  633.     def isDaemon(self):
  634.         return self.daemon
  635.  
  636.     
  637.     def setDaemon(self, daemonic):
  638.         self.daemon = daemonic
  639.  
  640.     
  641.     def getName(self):
  642.         return self.name
  643.  
  644.     
  645.     def setName(self, name):
  646.         self.name = name
  647.  
  648.  
  649.  
  650. def Timer(*args, **kwargs):
  651.     return _Timer(*args, **kwargs)
  652.  
  653.  
  654. class _Timer(Thread):
  655.     
  656.     def __init__(self, interval, function, args = [], kwargs = { }):
  657.         Thread.__init__(self)
  658.         self.interval = interval
  659.         self.function = function
  660.         self.args = args
  661.         self.kwargs = kwargs
  662.         self.finished = Event()
  663.  
  664.     
  665.     def cancel(self):
  666.         self.finished.set()
  667.  
  668.     
  669.     def run(self):
  670.         self.finished.wait(self.interval)
  671.         if not self.finished.is_set():
  672.             self.function(*self.args, **self.kwargs)
  673.         
  674.         self.finished.set()
  675.  
  676.  
  677.  
  678. class _MainThread(Thread):
  679.     
  680.     def __init__(self):
  681.         Thread.__init__(self, name = 'MainThread')
  682.         self._Thread__started.set()
  683.         self._set_ident()
  684.         _active_limbo_lock.acquire()
  685.         _active[_get_ident()] = self
  686.         _active_limbo_lock.release()
  687.  
  688.     
  689.     def _set_daemon(self):
  690.         return False
  691.  
  692.     
  693.     def _exitfunc(self):
  694.         self._Thread__stop()
  695.         t = _pickSomeNonDaemonThread()
  696.         if t:
  697.             pass
  698.         
  699.         while t:
  700.             t.join()
  701.             t = _pickSomeNonDaemonThread()
  702.         self._Thread__delete()
  703.  
  704.  
  705.  
  706. def _pickSomeNonDaemonThread():
  707.     for t in enumerate():
  708.         if not (t.daemon) and t.is_alive():
  709.             return t
  710.     
  711.  
  712.  
  713. class _DummyThread(Thread):
  714.     
  715.     def __init__(self):
  716.         Thread.__init__(self, name = _newname('Dummy-%d'))
  717.         del self._Thread__block
  718.         self._Thread__started.set()
  719.         self._set_ident()
  720.         _active_limbo_lock.acquire()
  721.         _active[_get_ident()] = self
  722.         _active_limbo_lock.release()
  723.  
  724.     
  725.     def _set_daemon(self):
  726.         return True
  727.  
  728.     
  729.     def join(self, timeout = None):
  730.         pass
  731.  
  732.  
  733.  
  734. def currentThread():
  735.     
  736.     try:
  737.         return _active[_get_ident()]
  738.     except KeyError:
  739.         return _DummyThread()
  740.  
  741.  
  742. current_thread = currentThread
  743.  
  744. def activeCount():
  745.     _active_limbo_lock.acquire()
  746.     count = len(_active) + len(_limbo)
  747.     _active_limbo_lock.release()
  748.     return count
  749.  
  750. active_count = activeCount
  751.  
  752. def enumerate():
  753.     _active_limbo_lock.acquire()
  754.     active = _active.values() + _limbo.values()
  755.     _active_limbo_lock.release()
  756.     return active
  757.  
  758. from thread import stack_size
  759. _shutdown = _MainThread()._exitfunc
  760.  
  761. try:
  762.     from thread import _local as local
  763. except ImportError:
  764.     from _threading_local import local
  765.  
  766.  
  767. def _after_fork():
  768.     global _active_limbo_lock
  769.     _active_limbo_lock = _allocate_lock()
  770.     new_active = { }
  771.     current = current_thread()
  772.     _active_limbo_lock.__enter__()
  773.     
  774.     try:
  775.         for thread in _active.itervalues():
  776.             if thread is current:
  777.                 ident = _get_ident()
  778.                 thread._Thread__ident = ident
  779.                 new_active[ident] = thread
  780.                 continue
  781.             _active_limbo_lock.__exit__
  782.             thread._Thread__stopped = True
  783.         
  784.         _limbo.clear()
  785.         _active.clear()
  786.         _active.update(new_active)
  787.     finally:
  788.         pass
  789.  
  790.  
  791.  
  792. def _test():
  793.     
  794.     class BoundedQueue(_Verbose):
  795.         
  796.         def __init__(self, limit):
  797.             _Verbose.__init__(self)
  798.             self.mon = RLock()
  799.             self.rc = Condition(self.mon)
  800.             self.wc = Condition(self.mon)
  801.             self.limit = limit
  802.             self.queue = deque()
  803.  
  804.         
  805.         def put(self, item):
  806.             self.mon.acquire()
  807.             while len(self.queue) >= self.limit:
  808.                 self._note('put(%s): queue full', item)
  809.                 self.wc.wait()
  810.             self.queue.append(item)
  811.             self._note('put(%s): appended, length now %d', item, len(self.queue))
  812.             self.rc.notify()
  813.             self.mon.release()
  814.  
  815.         
  816.         def get(self):
  817.             self.mon.acquire()
  818.             while not self.queue:
  819.                 self._note('get(): queue empty')
  820.                 self.rc.wait()
  821.             item = self.queue.popleft()
  822.             self._note('get(): got %s, %d left', item, len(self.queue))
  823.             self.wc.notify()
  824.             self.mon.release()
  825.             return item
  826.  
  827.  
  828.     
  829.     class ProducerThread(Thread):
  830.         
  831.         def __init__(self, queue, quota):
  832.             Thread.__init__(self, name = 'Producer')
  833.             self.queue = queue
  834.             self.quota = quota
  835.  
  836.         
  837.         def run(self):
  838.             random = random
  839.             import random
  840.             counter = 0
  841.             while counter < self.quota:
  842.                 counter = counter + 1
  843.                 self.queue.put('%s.%d' % (self.name, counter))
  844.                 _sleep(random() * 1e-05)
  845.  
  846.  
  847.     
  848.     class ConsumerThread(Thread):
  849.         
  850.         def __init__(self, queue, count):
  851.             Thread.__init__(self, name = 'Consumer')
  852.             self.queue = queue
  853.             self.count = count
  854.  
  855.         
  856.         def run(self):
  857.             while self.count > 0:
  858.                 item = self.queue.get()
  859.                 print item
  860.                 self.count = self.count - 1
  861.  
  862.  
  863.     NP = 3
  864.     QL = 4
  865.     NI = 5
  866.     Q = BoundedQueue(QL)
  867.     P = []
  868.     for i in range(NP):
  869.         t = ProducerThread(Q, NI)
  870.         t.name = 'Producer-%d' % (i + 1)
  871.         P.append(t)
  872.     
  873.     C = ConsumerThread(Q, NI * NP)
  874.     for t in P:
  875.         t.start()
  876.         _sleep(1e-06)
  877.     
  878.     C.start()
  879.     for t in P:
  880.         t.join()
  881.     
  882.     C.join()
  883.  
  884. if __name__ == '__main__':
  885.     _test()
  886.  
  887.