2010-10-28 12 views
7
Code

ressemble ci-dessous:python - comment obtenir le nombre de threads actifs démarrés par une classe spécifique?

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

Y at-il un moyen d'obtenir le nombre de threads étant actifs par classe d'origine?

Répondre

11

Ceci est une modification mineure de multiprocessing ActivePool example code de Doug Hellman (pour utiliser le filetage). L'idée est d'avoir vos travailleurs s'inscrire dans une piscine, désinscription eux-mêmes quand ils ont fini, en utilisant un threading.Lock pour coordonner la modification de la liste active de la piscine:

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

rendements

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

Vous pouvez utiliser un sémaphore pour chaque classe et obtenir leur nombre: voir link.

+0

qui est utile, Je vous remercie – m1k3y3