2016-06-14 3 views
2

웹 사이트를 통해 크롤링하고 보유하고있는 모든 비디오를 다운로드하는 프로그램을 작성하려고합니다. 개별 동영상 다운로드가 완료된 후에도 스레드 수가 계속 증가하는 문제에 직면하고 있습니다.파이썬에서 스레드 종료

다음은 대기중인 후 나중에 조인 된 개별 Worker 개체의 코드입니다. 이 코드는 스레드를 생성하는 유일한 부분입니다. 내가 이해할 수없는 것은 객체가 주어지면 나머지 스레드가있을 수 있다는 것이다. 나는 self.stop() 함수를 구현하고 while 회 돌이를 구현한다.

class Worker(Thread): 
def __init__(self, thread_pool): 
    Thread.__init__(self) 
    self.tasks = thread_pool.tasks 
    self.tasks_info = thread_pool.tasks_info 
    self.daemon = True 
    self._is_running=True 

    self.start()   
def stop(self): 
    self._is_running = False 
def run(self): 
    while self._is_running: 
     func, args, kargs = self.tasks.get() 
     try: func(*args, **kargs) 
     except Exception: 
      print("\nError: Threadpool error.") 
      sys.exit(1) 

     self.tasks_info['num_tasks_complete'] += 1    
     self.tasks.task_done() 
     self.stop() 

나는 살아있는 스레드를 확인하기 위해 스레드 기능을 사용했습니다, 그리고 그것은 대부분 Thread(SockThread)_MainThread라는 작업자의 기능뿐만 아니라 다른 개체가, 내가 방법을 모르는 이는 참으로 밝혀 닫기.

워커 스레드가 끝나지 않은 이유와 2. Thread(SockThread)_MainThread을 제거하는 방법에 대해 알려주십시오.

감사합니다.

당신이 초기화 한 것 같습니다 당신을보고 편집 한

class ThreadPool: 
def __init__(self, name, num_threads, num_tasks): 

    self.tasks = Queue(num_threads) 

    self.num_threads=num_threads 
    self.tasks_info = { 
     'name': name, 
     'num_tasks': num_tasks, 
     'num_tasks_complete': 0 
    } 
    for _ in range(num_threads): 
     Worker(self) 
    print(threading.active_count) 


def add_task(self, func, *args, **kwargs): 
    self.tasks.put((func, args, kwargs)) 
def wait_completion(self): 
    print("at the beginning of wait_completion:") 
    print(threading.active_count()) 
+1

당신은'_MainThread'을 제거하고 싶지 않습니다. 즉, 그 이름에서 알 수 있듯이 통역사가 시작한'_MainThread '입니다. 'func'이 실제로 무엇을하는지 모른 채 스레드가 멈추지 않는 이유를 추측하기는 꽤 어렵습니다. 또한 작업자 스레드를 작성하는 방법을 알고 있으면 유용합니다. – ig0774

+0

아, 나는 그 실을 지켜야한다는 것을 몰랐습니다. 고맙습니다. 작업자 스레드 작성 방법에 대한 코드 1 편집을 확인할 수 있습니까? – Peter

+0

'concurrent.futures.ThreadPoolExecutor' 또는'multiprocessing.dummy.Pool' (둘 다 스레드를 기반으로하며 별도의 프로세스를 기반으로 함)를 사용하지 않은 이유는 무엇입니까? – ShadowRanger

답변

0

당신도 적절한 방법이 아니다 시작 방법을 사용하여 processing.after의 run() 메소드를 호출 thread.which . 아래에 언급 된 코드를 사용하십시오.

 

from threading import Event 
class Worker(Thread): 
    def __init__(self, thread_pool): 
     self.tasks = thread_pool.tasks 
     self.tasks_info = thread_pool.tasks_info 
     self.exit = Event() 
     super(Thread,self).__init__() 

    def shutdown(self): 
     self.exit.set() 

    def run(self): 
     while not self.exit.is_set(): 
      func, args, kargs = self.tasks.get() 
      try: 
       func(*args, **kargs) 
      except Exception: 
       print("\nError: Threadpool error.") 
       # use shutdown method for error 
       self.shutdown() 
       sys.exit(1) 

      self.tasks_info['num_tasks_complete'] += 1    
      self.tasks.task_done() 
      self.shutdown() 
 
+0

안녕하십니까, 답변 해 주셔서 감사합니다. 이 작업을 시도하고 작업 (작업 할 것들?) 대기중인 큐에 대한 .join() 메서드에서 전체 코드가 작동을 멈 춥니 다. 왜 이럴 수 있니? – Peter

+0

ua 기능이 무엇인지 알면 멍청할까요? 우리는 shutdown 루프를 while 루프 안에서 멈추고 있습니다. 종료를 사용하여 thread.try를 멈추게 할 수 있습니다. 프로그램 종료를 원합니다. –