메인 프로그램이 끝날 때 스레드를 종료하는 방법은 무엇입니까?


답변:


46

이 질문을 확인하십시오. 정답은 올바른 방법으로 스레드를 종료하는 방법에 대한 훌륭한 설명을 제공합니다. Python에서 스레드를 종료 하는 방법이 있습니까?

키보드 인터럽트 신호 (ctrl + c)에서 스레드를 중지하려면 "KeyboardInterrupt"예외를 포착하고 종료하기 전에 정리할 수 있습니다. 이렇게 :

try:
    start_thread()  
except (KeyboardInterrupt, SystemExit):
    cleanup_stop_thread()
    sys.exit()

이렇게하면 프로그램이 갑자기 종료 될 때마다 수행 할 작업을 제어 할 수 있습니다.

또한 시그널 핸들러 (특정한 경우 SIGINT 시그널)를 설정할 수있는 내장 시그널 모듈을 사용할 수 있습니다. http://docs.python.org/library/signal.html


답장 해 주셔서 감사합니다. 나는 질문을 올바르게 설명하지 않았을 수 있습니다. 그 질문에 주어진 예에서 스레드의 stop () 함수를 실행하는 것이 여전히 필요했습니다. ctrl + C로 프로그램을 비정상적으로 종료하면 안됩니다. 그래서, 내 질문은 같은 비트는 "메인 스레드 흐름이 중단되면 나는 mythread.stop () funcion를 호출 어떻게"입니다
facha가

1
cleanup_stop_thread()내가 사용할 수있는 전역 함수는? 아니면 구현해야합니까?
알퍼

@alper, 아마도 무언가를 구현할 수있는 예일 뿐이라고 생각합니다. 구현해야합니다
Leonardo Rick

98

작업자 스레드 데몬 스레드를 만들면 데몬이 아닌 모든 스레드 (예 : 주 스레드)가 종료 될 때 종료됩니다.

http://docs.python.org/library/threading.html#threading.Thread.daemon


4
간단하고 정확한 답변에 감사드립니다. 기본 threading.Thread 데몬 상태 isDaemon()는 False이고 setDaemon(True).
Tong

3
이것은 질문에 답하고 작동합니다. 작전은 일반적으로 스레드를 깨끗하게 종료하는 방법을 묻지 않았습니다.
Johannes Overmann 2015

1
isDaemon()setDaemon()(링크 된 문서 위의 당), 단지 사용 된 게터 / 세터 있습니다 daemon=Truethreading.Thread()
fabio.sang

1
데몬 스레드를 사용하면 다른 문제가 발생할 수 있으며 여기서 원하는 것이 아닐 수 있습니다. stackoverflow.com/questions/20596918/…
Doopy

데몬 스레드를 사용하지 않고 스레드를 완전히 종료하려면 stackoverflow.com/questions/58910372/…를
Pat-Laugh

14

하위 스레드를 daemon-thread로 활성화하십시오.

예를 들어 :

권장 :

from threading import Thread

t = Thread(target=<your-method>)
t.daemon = True  # This thread dies when main thread (only non-daemon thread) exits.
t.start()

인라인 :

t = Thread(target=<your-method>, daemon=True).start()

이전 API :

t.setDaemon(True)
t.start()

메인 스레드가 종료되면 ( "예 : Ctrl+ C"를 누를 때 ) 다른 스레드도 위의 지침에 따라 종료됩니다.


1
데몬 스레드를 사용하면 다른 문제가 발생할 수 있으며 여기서 원하는 것이 아닐 수 있습니다. stackoverflow.com/questions/20596918/…
Doopy

12

Python의 표준 라이브러리의 atexit 모듈을 사용하여 KeyboardInterrupt. 이러한 종료 ​​함수는 (필연적으로 주 스레드에서!) stop필요한 모든 함수를 호출 할 수 있습니다. 스레드를로 설정하는 가능성과 함께 daemon필요한 시스템 기능을 적절하게 설계 할 수있는 도구를 제공합니다.


이 접근 방식은 2.6.5 이전의 Python 버전에서 데몬 화 된 스레드 없이도 작동했습니다 . stackoverflow.com/questions/3713360/…에 대한 답변을 참조하세요 . python 3.4 ( bugs.python.org/issue19466 ) 이전에는 종료 중 데몬 스레드가 약간 엉망이기 때문에 불행한 IMHO 입니다. atexit 핸들러에서 데몬 스레드 를 중지 하고 조인 하면 스레드 분해를 직렬화하는 비용 (아마도 중요하지 않은 비용)으로 모두 문제가 없습니다.
NeilenMarais

atexit.register()Python 모듈에서 지연된 호출로 인해 이상한 일이 발생할 수 있으며 , 이로 인해 종료 절차가의 호출 이후에 실행될 수 있습니다 multiprocessing. 나는 multiprocessing Queue 및 Thread를 사용하여 프로그램 종료시 "EOF 오류"Queuedaemon스레드를 다루는이 문제를 실행 합니다.
Delgan

3.7.4+와 같은 최신 버전의 Python에서는 atexit데몬이 아닌 스레드가 살아 있고 주 스레드가 종료 될 때 핸들러가 호출되지 않습니다. 스레드를 종료하기 위해 atexit을 사용할 때 스크립트가 종료시 멈춤을 참조하십시오 .
martineau 19.11.20

9

당신이 그렇게 쓰레드를 생성한다면 myThread = Thread(target = function)--그리고 그렇게한다 myThread.start(); myThread.join(). CTRL-C가 시작되면 주 스레드는 해당 차단 myThread.join()호출을 기다리고 있기 때문에 종료되지 않습니다 . 이 문제를 해결하려면 .join () 호출에 시간 제한을 입력하십시오. 제한 시간은 원하는만큼 길 수 있습니다. 무기한 대기를 원하면 99999와 같이 매우 긴 시간 제한을 설정 myThread.daemon = True하십시오. 주 스레드 (데몬이 아닌)가 종료 될 때 모든 스레드가 종료되도록하는 것도 좋은 방법 입니다.


myThread.daemon = True이 문제에 대한 훌륭한 해결책입니다.
Brannon

5
@Brannon .daemon=True은 고체 솔루션이 아닙니다. 설명을 보려면이 스레드를 확인하십시오. stackoverflow.com/a/20598791/5562492
Odyssee

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.