2010-07-21 4 views
1

GUI와 작업자 스레드의 두 가지 스레드를 실행하는 Tkinter GUI가 있습니다. 작업자 스레드는 다음 코드를 사용하여 하위 프로세스를 만듭니다단위 테스트를 즉시 실행하는 파이썬 하위 프로세스를 중지하는 방법은 무엇입니까? Terminate and kill not working

파일 runTests.py 몇 가지 설정을 수행 한 후 다음 명령을 사용하여 단위 테스트 파일을 실행합니다
myProcess = subprocess.Popen(['python', '-u', 'runTests.py'], 
         stdout=subprocess.PIPE, 
         stderr=subprocess.STDOUT) 

:

execfile('myUnitTests.py') 

파일 myUnitTests.py을 몇 가지 단위 테스트를 수행하여 실행하는 데 5 분 이상 걸립니다. GUI에서 테스트 실행을 중지하기 위해 버튼을 클릭합니다. 이 차례로 작업자 스레드가 서브 프로세스 중지 신호를 전송하게 : 현재 단위 테스트가 수행을 완료 한 후이 프로세스를 종료 할 때까지

myProcess.terminate() 

종료 명령을 즉시 프로세스를 중지하지 않습니다 기다린다? os.kill을 사용하려했지만 terminate()과 같은 결과가 나옵니다.

내 프로그램의 응답 속도를 향상시켜 서브 프로세스를 즉시 종료시킬 수있는 방법에 대한 아이디어는 무엇입니까?

답변

2

파이썬 문서는 [http://docs.python.org/library/signal.html] 말한다 : 파이썬 신호 처리기가 비동기까지 파이썬 사용자에 관한 한이라고

  • 하지만, 그들은 단지 파이썬 인터프리터의 "원자"지시 사이에 발생할 수 있습니다 . 즉, C로만 구현 된 긴 계산 중에 도착한 신호 (예 : 큰 본문에서의 정규 표현식 일치)는 임의의 시간 동안 지연 될 수 있습니다.

그래서 당신의 5 분 단위 테스트가하고있는 경우 "C에서 순수하게 구현 된 긴 계산", 당신의 단위 테스트 하네스는이 문제입니다, SIGTERM에 대한 처리기를 설치합니다. 그렇다면 myProcess.terminate 대신 myProcess.kill을 시도하십시오 (또는 2.6이없는 경우 myProcess.send_signal(9)). SIGKILL은 사용자 공간에서 검색 할 수 없으며 즉시 효력을 가져야합니다.

경고 : 단원 테스트 프레임 워크를 나가기 위해 실행해야하는 모든 정리 작업은 실행되지 않습니다.

관련 문제