我正在尝试编写一个程序来浏览网站并下载它拥有的所有视频。我遇到了一个问题,即即使在完成单个视频的下载后,线程数也会不断增加。
以下是单个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())
答案 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()