2010-10-28 8 views
7

Code sieht wie folgt:python - Wie bekomme ich die Anzahl der aktiven Threads, die von einer bestimmten Klasse gestartet wurden?

class workers1(Thread): 
... def __init__(self): 
...  Thread.__init__(self) 
... def run(self): 
...  ...do some stuff 

class workers2(Thread): 
... def __init__(self): 
...  Thread.__init__(self) 
... def run(self): 
...  ...do some stuff 


if __name__ == "__main__": 
... start workers 
while True: 
    print "Number of threads active", threading.activeCount() 
    print "Number of worker1 threads", ?????, "Number of worker2 threads", ????? 

Gibt es eine Möglichkeit die Anzahl der Threads von Ursprungsklasse aktiv zu bekommen?

Antwort

11

Dies ist eine geringfügige Modifikation von Doug Hellmans multiprocessing ActivePool example code (Threading verwenden). Die Idee ist, Ihre Mitarbeiter sich in einem Pool registrieren haben, austragen selbst wenn sie fertig ist, ein threading.Lock mit Änderung des Pools aktiven Liste zu koordinieren:

import threading 
import time 
import random 

class ActivePool(object): 
    def __init__(self): 
     super(ActivePool, self).__init__() 
     self.active=[] 
     self.lock=threading.Lock() 
    def makeActive(self, name): 
     with self.lock: 
      self.active.append(name) 
    def makeInactive(self, name): 
     with self.lock: 
      self.active.remove(name) 
    def numActive(self): 
     with self.lock: 
      return len(self.active) 
    def __str__(self): 
     with self.lock: 
      return str(self.active) 
def worker(pool): 
    name=threading.current_thread().name 
    pool.makeActive(name) 
    print 'Now running: %s' % str(pool) 
    time.sleep(random.randint(1,3)) 
    pool.makeInactive(name) 

if __name__=='__main__': 
    poolA=ActivePool() 
    poolB=ActivePool()  
    jobs=[] 
    for i in range(5): 
     jobs.append(
      threading.Thread(target=worker, name='A{0}'.format(i), 
          args=(poolA,))) 
     jobs.append(
      threading.Thread(target=worker, name='B{0}'.format(i), 
          args=(poolB,))) 
    for j in jobs: 
     j.daemon=True 
     j.start() 
    while threading.activeCount()>1: 
     for j in jobs: 
      j.join(1) 
      print 'A-threads active: {0}, B-threads active: {1}'.format(
       poolA.numActive(),poolB.numActive()) 

Ausbeuten

Now running: ['A0'] 
Now running: ['B0'] 
Now running: ['A0', 'A1'] 
Now running: ['B0', 'B1'] 
Now running: ['A0', 'A1', 'A2'] 
Now running: ['B0', 'B1', 'B2'] 
Now running: ['A0', 'A1', 'A2', 'A3'] 
Now running: ['B0', 'B1', 'B2', 'B3'] 
Now running: ['A0', 'A1', 'A2', 'A3', 'A4'] 
Now running: ['B0', 'B1', 'B2', 'B3', 'B4'] 
A-threads active: 4, B-threads active: 5 
A-threads active: 2, B-threads active: 5 
A-threads active: 0, B-threads active: 3 
A-threads active: 0, B-threads active: 3 
A-threads active: 0, B-threads active: 3 
A-threads active: 0, B-threads active: 3 
A-threads active: 0, B-threads active: 3 
A-threads active: 0, B-threads active: 0 
A-threads active: 0, B-threads active: 0 
A-threads active: 0, B-threads active: 0 
3

Sie können einen Semaphor für jede Klasse verwenden und ihre Anzahl erhalten: siehe link.

+0

, die hilfreich ist, Danke – m1k3y3

Verwandte Themen