代码之家  ›  专栏  ›  技术社区  ›  m1k3y3

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

  •  11
  • m1k3y3  · 技术社区  · 14 年前

    代码如下:

    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 回复  |  直到 7 年前
        1
  •  15
  •   unutbu    14 年前

    这是道格·赫尔曼的 multiprocessing ActivePool example code (使用螺纹)。想法是让你的工作人员在池中注册自己,完成后使用线程注销自己。锁定以协调池活动列表的修改:

    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
    
        2
  •  3
  •   Mikhail    12 年前

    您可以为每个类使用一个信号量并获取它们的计数:请参见 link .