python - 如何获取特定类启动的活动线程数?

时间:2010-10-28 20:37:33

标签: python multithreading count

代码如下所示:

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

有没有办法通过发起类来获取活动线程的数量?

2 个答案:

答案 0 :(得分:14)

这是Doug Hellman的multiprocessing ActivePool example code(使用线程)的一个小修改。我们的想法是让你的工作人员在池中注册,在完成时注册自己,使用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

答案 1 :(得分:3)

您可以为每个班级使用信号量并获取他们的计数:请参阅link

相关问题