cinap_lenrekadd hg and python4bb9e2215 years agoHistory
816 lines · 25.6 KB · Python
RawDownload
            self.__stop()            try:                self.__delete()            except:                pass     def __stop(self):        self.__block.acquire()        self.__stopped = True        self.__block.notifyAll()        self.__block.release()     def __delete(self):        "Remove current thread from the dict of currently running threads."         # Notes about running with dummy_thread:        #        # Must take care to not raise an exception if dummy_thread is being        # used (and thus this module is being used as an instance of        # dummy_threading).  dummy_thread.get_ident() always returns -1 since        # there is only one thread if dummy_thread is being used.  Thus        # len(_active) is always <= 1 here, and any Thread instance created        # overwrites the (if any) thread currently registered in _active.        #        # An instance of _MainThread is always created by 'threading'.  This        # gets overwritten the instant an instance of Thread is created; both        # threads return -1 from dummy_thread.get_ident() and thus have the        # same key in the dict.  So when the _MainThread instance created by        # 'threading' tries to clean itself up when atexit calls this method        # it gets a KeyError if another Thread instance was created.        #        # This all means that KeyError from trying to delete something from        # _active if dummy_threading is being used is a red herring.  But        # since it isn't if dummy_threading is *not* being used then don't        # hide the exception.         _active_limbo_lock.acquire()        try:            try:                del _active[_get_ident()]            except KeyError:                if 'dummy_threading' not in _sys.modules:                    raise        finally:            _active_limbo_lock.release()     def join(self, timeout=None):        assert self.__initialized, "Thread.__init__() not called"        assert self.__started, "cannot join thread before it is started"        assert self is not currentThread(), "cannot join current thread"        if __debug__:            if not self.__stopped:                self._note("%s.join(): waiting until thread stops", self)        self.__block.acquire()        try:            if timeout is None:                while not self.__stopped:                    self.__block.wait()                if __debug__:                    self._note("%s.join(): thread stopped", self)            else:                deadline = _time() + timeout                while not self.__stopped:                    delay = deadline - _time()                    if delay <= 0:                        if __debug__:                            self._note("%s.join(): timed out", self)                        break                    self.__block.wait(delay)                else:                    if __debug__:                        self._note("%s.join(): thread stopped", self)        finally:            self.__block.release()     def getName(self):        assert self.__initialized, "Thread.__init__() not called"        return self.__name     def setName(self, name):        assert self.__initialized, "Thread.__init__() not called"        self.__name = str(name)     def isAlive(self):        assert self.__initialized, "Thread.__init__() not called"        return self.__started and not self.__stopped     def isDaemon(self):        assert self.__initialized, "Thread.__init__() not called"        return self.__daemonic     def setDaemon(self, daemonic):        assert self.__initialized, "Thread.__init__() not called"        assert not self.__started, "cannot set daemon status of active thread"        self.__daemonic = daemonic # The timer class was contributed by Itamar Shtull-Trauring def Timer(*args, **kwargs):    return _Timer(*args, **kwargs) class _Timer(Thread):    """Call a function after a specified number of seconds:     t = Timer(30.0, f, args=[], kwargs={})    t.start()    t.cancel() # stop the timer's action if it's still waiting    """     def __init__(self, interval, function, args=[], kwargs={}):        Thread.__init__(self)        self.interval = interval        self.function = function        self.args = args        self.kwargs = kwargs        self.finished = Event()     def cancel(self):        """Stop the timer if it hasn't finished yet"""        self.finished.set()     def run(self):        self.finished.wait(self.interval)        if not self.finished.isSet():            self.function(*self.args, **self.kwargs)        self.finished.set() # Special thread class to represent the main thread# This is garbage collected through an exit handler class _MainThread(Thread):     def __init__(self):        Thread.__init__(self, name="MainThread")        self._Thread__started = True        _active_limbo_lock.acquire()        _active[_get_ident()] = self        _active_limbo_lock.release()     def _set_daemon(self):        return False     def _exitfunc(self):        self._Thread__stop()        t = _pickSomeNonDaemonThread()        if t:            if __debug__:                self._note("%s: waiting for other threads", self)        while t:            t.join()            t = _pickSomeNonDaemonThread()        if __debug__:            self._note("%s: exiting", self)        self._Thread__delete() def _pickSomeNonDaemonThread():    for t in enumerate():        if not t.isDaemon() and t.isAlive():            return t    return None  # Dummy thread class to represent threads not started here.# These aren't garbage collected when they die, nor can they be waited for.# If they invoke anything in threading.py that calls currentThread(), they# leave an entry in the _active dict forever after.# Their purpose is to return *something* from currentThread().# They are marked as daemon threads so we won't wait for them# when we exit (conform previous semantics). class _DummyThread(Thread):     def __init__(self):        Thread.__init__(self, name=_newname("Dummy-%d"))         # Thread.__block consumes an OS-level locking primitive, which        # can never be used by a _DummyThread.  Since a _DummyThread        # instance is immortal, that's bad, so release this resource.        del self._Thread__block         self._Thread__started = True        _active_limbo_lock.acquire()        _active[_get_ident()] = self        _active_limbo_lock.release()     def _set_daemon(self):        return True     def join(self, timeout=None):        assert False, "cannot join a dummy thread"  # Global API functions def currentThread():    try:        return _active[_get_ident()]    except KeyError:        ##print "currentThread(): no current thread for", _get_ident()        return _DummyThread() def activeCount():    _active_limbo_lock.acquire()    count = len(_active) + len(_limbo)    _active_limbo_lock.release()    return count def enumerate():    _active_limbo_lock.acquire()    active = _active.values() + _limbo.values()    _active_limbo_lock.release()    return active from thread import stack_size # Create the main thread object,# and make it available for the interpreter# (Py_Main) as threading._shutdown. _shutdown = _MainThread()._exitfunc # get thread-local implementation, either from the thread# module, or from the python fallback try:    from thread import _local as localexcept ImportError:    from _threading_local import local  # Self-test code def _test():     class BoundedQueue(_Verbose):         def __init__(self, limit):            _Verbose.__init__(self)            self.mon = RLock()            self.rc = Condition(self.mon)            self.wc = Condition(self.mon)            self.limit = limit            self.queue = deque()         def put(self, item):            self.mon.acquire()            while len(self.queue) >= self.limit:                self._note("put(%s): queue full", item)                self.wc.wait()            self.queue.append(item)            self._note("put(%s): appended, length now %d",                       item, len(self.queue))            self.rc.notify()            self.mon.release()         def get(self):            self.mon.acquire()            while not self.queue:                self._note("get(): queue empty")                self.rc.wait()            item = self.queue.popleft()            self._note("get(): got %s, %d left", item, len(self.queue))            self.wc.notify()            self.mon.release()            return item     class ProducerThread(Thread):         def __init__(self, queue, quota):            Thread.__init__(self, name="Producer")            self.queue = queue            self.quota = quota         def run(self):            from random import random            counter = 0            while counter < self.quota:                counter = counter + 1                self.queue.put("%s.%d" % (self.getName(), counter))                _sleep(random() * 0.00001)      class ConsumerThread(Thread):         def __init__(self, queue, count):            Thread.__init__(self, name="Consumer")            self.queue = queue            self.count = count         def run(self):            while self.count > 0:                item = self.queue.get()                print item                self.count = self.count - 1     NP = 3    QL = 4    NI = 5     Q = BoundedQueue(QL)    P = []    for i in range(NP):        t = ProducerThread(Q, NI)        t.setName("Producer-%d" % (i+1))        P.append(t)    C = ConsumerThread(Q, NI*NP)    for t in P:        t.start()        _sleep(0.000001)    C.start()    for t in P:        t.join()    C.join() if __name__ == '__main__':    _test()

Lines 501–816 of 816. Previous lines