代码如下所示:
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", ?????
有没有办法通过发起类来获取活动线程的数量?
答案 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。