退出Python中的线程

时间:2016-06-14 09:40:35

标签: python multithreading

我正在尝试编写一个程序来浏览网站并下载它拥有的所有视频。我遇到了一个问题,即即使在完成单个视频的下载后,线程数也会不断增加。

以下是单个Worker对象的代码,该对象排队等待,然后再加入。这是我生成一个Thread的代码的唯一部分。我不明白的是,如果给定对象,可以有剩余的线程,我实现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的其他对象,我这样做不知道如何关闭。

请告知1.为什么工作线程没有结束?2。如何摆脱Thread(SockThread)以及_MainThread

谢谢!

编辑1

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 个答案:

答案 0 :(得分:1)

通过查看你看起来你已经初始化了thread.which调用run()方法进行处理。之后你甚至使用了start方法,这是不正确的方法。 请使用下面提到的代码。

 

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()