2010-04-01 3 views

답변

35

이 질문을 확인하십시오. Is there any way to kill a Thread in Python?

가 키보드 인터럽트 신호 (Ctrl + C)에서 스레드 정지하려면 당신이 종료하기 전에 예외 "KeyboardInterrupt"및 정리를 잡을 수 : 정답은 올바른 방법으로 나사산 종료하는 방법에 대한 좋은 설명이있다. 이처럼 :

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

이 프로그램이 갑자기 종료 될 때마다 무엇을 제어 할 수있는이 방법.

또한 사용할 수있는 내장 (특정 경우에 SIGINT 신호) 당신에게 설정 신호 처리기를 할 수 있습니다 신호 모듈 : http://docs.python.org/library/signal.html

+0

답장을 보내 주셔서 감사합니다. 나는 질문을 정확하게 말하지 않았을 수도 있습니다. 이 질문에 주어진 예제에서 스레드의 stop() 함수를 실행해야했습니다. Ctrl + C로 비정상적으로 프로그램을 종료하면 그럴 수 없습니다. 그래서, 내 질문은 "주 스레드 흐름이 중단되면 mythread.stop() 함수를 호출하는 방법"과 비슷합니다. – facha

+0

내 질문을 편집했습니다. – rogeriopvl

+2

코드 예제에서 아직 세미콜론을 발견하지 못했습니까? 좋아! –

65

당신이 당신의 노동자가 데몬 스레드를 스레드 할 경우, 그들이 죽을를 모두를 비 데몬 스레드 (예 : 메인 스레드)가 종료되었습니다.

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

+2

간단하고 정확한 답을 주셔서 감사합니다. 기본 threading.Thread 데몬 상태 인 isDaemon()은 False입니다. setDaemon (True)로 True로 설정하십시오. – Tony

+1

이 질문에 대답하고 그냥 작동합니다. op는 스레드를 정상적으로 종료하는 방법을 묻지 않았습니다. –

9

사용 파이썬의 표준 라이브러리의 atexit 모듈 캐치되지 않는 예외 등을 포함하여 메인 스레드의 합리적으로 "깨끗한"종료에 (주 스레드에서) 호출되는 "종료"기능을 등록 KeyboardInterrupt. 이러한 종료 ​​기능은 (비록 필연적으로 메인 스레드에서도!) 어떤 stop 함수로 호출 할 수 있습니다. 스레드를 daemon으로 설정할 수있는 가능성과 함께 필요한 시스템 기능을 적절히 설계 할 수있는 도구를 제공합니다.

+0

이 접근법은 2.6.5 이전의 Python 버전에서 데몬 스레드를 사용하지 않고도 효과가있었습니다. http://stackoverflow.com/questions/3713360/python-2-6-x-theading-signals-atexit-fail- 일부 버전. 이것은 종료시 데몬 스레드가 파이썬 3.4 (http://bugs.python.org/issue19466) 이전에 약간 엉망 이었기 때문에 불행한 IMHO입니다. atexit 핸들러에서 데몬 스레드를 멈추고 스레드 결합을 중지하면 스레드 해체를 직렬화하는 비용이 거의 들지 않아도됩니다. – NeilenMarais

4

이렇게 스레드를 생성하는 경우 - myThread = Thread(target = function) - 그리고 myThread.start(); myThread.join()을 수행하십시오. CTRL-C가 시작되면 메인 스레드는 블로킹 myThread.join() 호출을 기다리고 있기 때문에 종료하지 않습니다. 이 문제를 해결하려면 .join() 호출에서 제한 시간을 넣기 만하면됩니다. 타임 아웃은 원하는만큼 길어질 수 있습니다. 만약 무한정 기다리고 싶다면, 99999와 같은 아주 긴 시간 제한을 넣으십시오. myThread.daemon = True을 실행하는 것이 좋습니다. 그러면 메인 스레드 (비 데몬)가 종료 될 때 모든 스레드가 종료됩니다.

+0

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

+0

@Brannon'.daemon = True'는 단단한 해결책이 아닙니다. 이 스레드에서 설명을 확인하십시오. https://stackoverflow.com/a/20598791/5562492 –

관련 문제