Как получить количество активных потоков, запущенных определенным классом?

код выглядит следующим образом:

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

Есть ли способ получить количество активных потоков по исходному классу?


person m1k3y3    schedule 28.10.2010    source источник


Ответы (2)


Это небольшая модификация примера многопроцессорного ActivePool Дуга Хеллмана (для использования потоков). . Идея состоит в том, чтобы ваши воркеры зарегистрировались в пуле, отменили регистрацию, когда они закончат работу, используя threading.Lock для координации модификации активного списка пула:

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

урожаи

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
person unutbu    schedule 28.10.2010

Вы можете использовать семафор для каждого класса и получить их количество: см. ссылка. .

person Scott    schedule 28.10.2010