2010-10-28 14 views
7

kod wygląda następująco:python - jak uzyskać liczbę aktywnych wątków uruchomionych przez określoną klasę?

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

Czy istnieje sposób, aby uzyskać liczbę nici jest aktywny przez klasie pochodzącej?

Odpowiedz

11

Jest to niewielka modyfikacja funkcji Doug Hellmana multiprocessing ActivePool example code (użycie wątków). Chodzi o to, aby twoi pracownicy rejestrują się w basenie, wyrejestrować siebie, kiedy skończysz, używając threading.Lock do modyfikacji listy aktywnych w basenie z współrzędnych:

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

plony

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

Możesz użyć semafora dla każdej klasy i uzyskać ich liczbę: patrz link.

+0

to pomocne, Dziękuję Ci – m1k3y3

Powiązane problemy