무한 루프에 스레드가있는 경우 기본 프로그램이 종료 될 때 (예 : Ctrl+를 누를 때) 종료하는 방법이 C있습니까?
답변:
이 질문을 확인하십시오. 정답은 올바른 방법으로 스레드를 종료하는 방법에 대한 훌륭한 설명을 제공합니다. Python에서 스레드를 종료 하는 방법이 있습니까?
키보드 인터럽트 신호 (ctrl + c)에서 스레드를 중지하려면 "KeyboardInterrupt"예외를 포착하고 종료하기 전에 정리할 수 있습니다. 이렇게 :
try:
start_thread()
except (KeyboardInterrupt, SystemExit):
cleanup_stop_thread()
sys.exit()
이렇게하면 프로그램이 갑자기 종료 될 때마다 수행 할 작업을 제어 할 수 있습니다.
또한 시그널 핸들러 (특정한 경우 SIGINT 시그널)를 설정할 수있는 내장 시그널 모듈을 사용할 수 있습니다. http://docs.python.org/library/signal.html
cleanup_stop_thread()
내가 사용할 수있는 전역 함수는? 아니면 구현해야합니까?
작업자 스레드 데몬 스레드를 만들면 데몬이 아닌 모든 스레드 (예 : 주 스레드)가 종료 될 때 종료됩니다.
http://docs.python.org/library/threading.html#threading.Thread.daemon
isDaemon()
는 False이고 setDaemon(True)
.
isDaemon()
및 setDaemon()
(링크 된 문서 위의 당), 단지 사용 된 게터 / 세터 있습니다 daemon=True
에threading.Thread()
하위 스레드를 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"를 누를 때 ) 다른 스레드도 위의 지침에 따라 종료됩니다.
Python의 표준 라이브러리의 atexit 모듈을 사용하여 KeyboardInterrupt
. 이러한 종료 함수는 (필연적으로 주 스레드에서!) stop
필요한 모든 함수를 호출 할 수 있습니다. 스레드를로 설정하는 가능성과 함께 daemon
필요한 시스템 기능을 적절하게 설계 할 수있는 도구를 제공합니다.
atexit.register()
Python 모듈에서 지연된 호출로 인해 이상한 일이 발생할 수 있으며 , 이로 인해 종료 절차가의 호출 이후에 실행될 수 있습니다 multiprocessing
. 나는 multiprocessing Queue 및 Thread를 사용하여 프로그램 종료시 "EOF 오류"Queue
와 daemon
스레드를 다루는이 문제를 실행 합니다.
atexit
데몬이 아닌 스레드가 살아 있고 주 스레드가 종료 될 때 핸들러가 호출되지 않습니다. 스레드를 종료하기 위해 atexit을 사용할 때 스크립트가 종료시 멈춤을 참조하십시오 .
당신이 그렇게 쓰레드를 생성한다면 myThread = Thread(target = function)
--그리고 그렇게한다 myThread.start(); myThread.join()
. CTRL-C가 시작되면 주 스레드는 해당 차단 myThread.join()
호출을 기다리고 있기 때문에 종료되지 않습니다 . 이 문제를 해결하려면 .join () 호출에 시간 제한을 입력하십시오. 제한 시간은 원하는만큼 길 수 있습니다. 무기한 대기를 원하면 99999와 같이 매우 긴 시간 제한을 설정 myThread.daemon = True
하십시오. 주 스레드 (데몬이 아닌)가 종료 될 때 모든 스레드가 종료되도록하는 것도 좋은 방법 입니다.
myThread.daemon = True
이 문제에 대한 훌륭한 해결책입니다.
.daemon=True
은 고체 솔루션이 아닙니다. 설명을 보려면이 스레드를 확인하십시오. stackoverflow.com/a/20598791/5562492
데몬 스레드는 비정상적으로 종료되므로 종료 자 명령이 실행되지 않습니다. 가능한 해결책은 무한 루프 대신 메인 스레드가 살아 있는지 확인하는 것입니다.
예 : Python 3 :
while threading.main_thread().isAlive():
do.you.subthread.thing()
gracefully.close.the.thread()