This is a minor modification of the Doug Hellman multiprocessor code example ActivePool (for using threads). The idea is for your workers to register in the pool, unregister when they are finished using threading.Lock to coordinate the modification of the active pool 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())
gives
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