웹 사이트를 통해 크롤링하고 보유하고있는 모든 비디오를 다운로드하는 프로그램을 작성하려고합니다. 개별 동영상 다운로드가 완료된 후에도 스레드 수가 계속 증가하는 문제에 직면하고 있습니다.파이썬에서 스레드 종료
다음은 대기중인 후 나중에 조인 된 개별 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())
당신은'_MainThread'을 제거하고 싶지 않습니다. 즉, 그 이름에서 알 수 있듯이 통역사가 시작한'_MainThread '입니다. 'func'이 실제로 무엇을하는지 모른 채 스레드가 멈추지 않는 이유를 추측하기는 꽤 어렵습니다. 또한 작업자 스레드를 작성하는 방법을 알고 있으면 유용합니다. – ig0774
아, 나는 그 실을 지켜야한다는 것을 몰랐습니다. 고맙습니다. 작업자 스레드 작성 방법에 대한 코드 1 편집을 확인할 수 있습니까? – Peter
'concurrent.futures.ThreadPoolExecutor' 또는'multiprocessing.dummy.Pool' (둘 다 스레드를 기반으로하며 별도의 프로세스를 기반으로 함)를 사용하지 않은 이유는 무엇입니까? – ShadowRanger