python - how to get the number of active threads started by specific class?

后端 未结 2 1630
孤街浪徒
孤街浪徒 2020-12-09 05:12

code looks like below:

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

clas         


        
相关标签:
2条回答
  • 2020-12-09 05:39

    This is a minor modification of Doug Hellman's multiprocessing ActivePool example code (to use threading). The idea is to have your workers register themselves in a pool, unregister themselves when they finish, using a threading.Lock to coordinate modification of the pool's active list:

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

    yields

    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
    
    0 讨论(0)
  • 2020-12-09 06:03

    You can use a semaphore for each class and get their counts: see link.

    0 讨论(0)
提交回复
热议问题