2010-10-28 14 views
7

codice è simile di seguito:python - come ottenere il numero di thread attivi avviati da una classe specifica?

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", ????? 

C'è un modo per ottenere il numero di thread di essere attivi per classe originario?

risposta

11

Questa è una modifica secondaria di Doug Hellman multiprocessing ActivePool example code (per utilizzare il threading). L'idea è quella di avere i vostri lavoratori si registrano in una piscina, annullare la registrazione se stessi quando hanno finito, utilizzando un threading.Lock per coordinare la modifica della lista attiva della piscina:

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()) 

rendimenti

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

È possibile utilizzare un semaforo per ogni classe e ottenere i relativi conteggi: vedere link.

+0

che è utile, grazie – m1k3y3

Problemi correlati