복붙노트

[PYTHON] 파이썬 - 특정 클래스에 의해 시작된 활성 스레드 수를 얻는 방법?

PYTHON

파이썬 - 특정 클래스에 의해 시작된 활성 스레드 수를 얻는 방법?

코드는 다음과 같습니다.

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

원래 클래스가 활성 상태 인 스레드 수를 얻는 방법이 있습니까?

해결법

  1. ==============================

    1.이것은 Doug Hellman의 다중 처리 ActivePool 예제 코드를 약간 수정 한 것입니다 (스레딩 사용). 아이디어는 풀장에 노동자를 등록시키고, 마무리 할 때 등록을 취소하고, 스레딩을 사용하여 풀의 활성 목록 수정을 조정하는 것입니다.

    이것은 Doug Hellman의 다중 처리 ActivePool 예제 코드를 약간 수정 한 것입니다 (스레딩 사용). 아이디어는 풀장에 노동자를 등록시키고, 마무리 할 때 등록을 취소하고, 스레딩을 사용하여 풀의 활성 목록 수정을 조정하는 것입니다.

    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. ==============================

    2.각 클래스에 대한 세마포를 사용하여 카운트를 얻을 수 있습니다 (링크 참조).

    각 클래스에 대한 세마포를 사용하여 카운트를 얻을 수 있습니다 (링크 참조).

  3. from https://stackoverflow.com/questions/4046986/python-how-to-get-the-number-of-active-threads-started-by-specific-class by cc-by-sa and MIT license