2011-07-06 5 views
6

Windows에 다중 스레드 Python 응용 프로그램을 작성하고 있습니다.스레딩을 사용할 때 Ctrl-C가 작동하지 않습니다.

ctrl-c을 사용하여 앱을 종료하는 데 사용한 적이 있지만 threading.Timer 인스턴스를 추가하면 ctrl-c 작업이 중지되거나 때로는 매우 오랜 시간이 걸릴 수 있습니다.

어떻게 될 수 있습니까?
타이머 스레드와 ctrl-c 사이의 관계는 무엇입니까?

UPDATE는 다음 KeyboardInterrupt 예외가 임의의 스레드를 수신합니다 :

스레드 인터럽트 이상하게 상호 작용 :
나는 파이썬의 thread documentation에 다음을 발견했다. (신호 모듈을 사용할 수있는 경우, 는 메인 스레드로 이동 항상 중단됩니다.)

+0

여기에 코드를 붙여 넣을 수 있습니까? – Rahul

답변

4

방법 threading.Thread (따라서 threading.Timer) 작동은하는 threading 모듈과 각 스레드에 자동적으로 등록 및 통역 출구에있다 인터프리터는 인터프리터를 종료하기 전에 등록 된 모든 스레드가 종료 될 때까지 기다립니다. 이것은 인터프리터를 잔인하게 제거하지 않고 스레드가 실제로 실행을 끝내기 위해 수행됩니다. 따라서^C를 치면 주 스레드가 신호를 받아서 종료를 결정하고 타이머가 끝나기를 기다립니다.

당신은 설정할 수 있습니다 스레드 악마의합니다 (setDaemon 방법)가 인터프리터가 종료하면 종료하는 동안 혼란 오류가 발생할 때 파이썬 코드를 실행하는 일이면 스레딩 모듈은 이러한 스레드를 기다릴 수 있지만 만드는. threading.Timer을 취소하고 (데몬을 설정하더라도) 깨우면 깨어 났을 때 깨어날 수 있습니다. 왜냐하면 threading.Timercancel 메서드는 깨어 났을 때 아무 것도 실행하지 말고 실제로 실행해야한다고 알려주기 때문입니다 그 결정을 내리는 파이썬 코드.

현재 스레드 이외의 스레드를 종료하는 적절한 방법이 없으며 차단 된 스레드를 방해 할 수있는 확실한 방법이 없습니다. 타이머에 대해보다 쉽게 ​​접근 할 수있는 방법은 일반적으로 GUI 및 기타 이벤트 기반 시스템이 제공하는 것과 같은 이벤트 루프입니다. 사용할 내용은 전적으로 에 달려 있으며 그 밖의 프로그램은입니다.

+0

큰 그림을 가져 주셔서 감사합니다. 당분간 문제를 해결 한 스레드 데몬을 표시했지만, 어느 시점에서 적절한 종료 흐름을 갖기 위해 리팩토링해야 할 것입니다. – Jonathan

+0

타이머가 동일한 스레드에 설정되어 있으면 신호 처리기가 실행됩니까? 그렇다면 timer.Cancel을 시그널 핸들러에서 설정할 수 있다면 프로세스가 지금 종료 할 수 있습니까? – Vivek

+0

+1. 왜 거기에 "현재 스레드를 제외하고는 스레드를 종료 할 수있는 정상적인 방법이 없으며, 차단 된 스레드를 인터럽트 할 수있는 확실한 방법이 없다"고 설명하는 리소스가 있습니까? – n611x007

2

데이비드 비즐리 (David Beazley)의 프레젠테이션을 통해 주제에 대해 알 수 있습니다. PDF 파일은 here입니다. 22-25 페이지 ("Interlude : Signals"에서 "Frozen Signals"까지)를보십시오.

+0

그건 통찰력있는 PDF입니다. – Jonathan

관련 문제