2017-02-28 2 views
1

안녕하세요, 저는 Python과 멀티 스레드 프로그래밍을 처음 사용합니다. 몇 가지 테스트 단계를 거치는 스크립트가 있습니다. 한편이 실행되고있는 간격으로 폴링하고 모든 프로세스가 실행 중에 충돌이 있는지 읽는 스레드를 만들고 싶습니다. 나는이 정보를 얻는 함수를 가지고있다. 내 문제는 그 스레드가 예외가 발생할 때마다 나는 그 프로세스가 추락했다는 것이다. 현재 스레드는 다음과 같습니다.파이썬의 메인 스레드에서 스레드의 예외를 잡습니다.

class process_thread(threading.Thread): 
    def __init__(self): 
    threading.Thread.__init__(self) 
    self.run_thread = True 

    def run(self): 
    while self.run_thread: 
     if has_any_processes_crashed() == -1: 
     self.run_thread = False 
     raise MyStopException("A process has crashed") # This is the problematic line. It is only raised in this thread, not in main thread. 
     else: 
     time.sleep(3) 

그러나 예외는 해당 스레드에서만 발생하며 주 스레드에서는 발생하지 않습니다. 나는 거기에서 같은 예외를 던지고 스크립트를 종료하고 싶다. 이 스레드로 수행하는 작업은 모든 테스트 단계로 시작하여 데몬 스레드로 설정하기 전에 개체를 만드는 것입니다. 내 테스트 단계가 완료되면 시뮬레이션을 종료하기 전에이 스레드를 종료하고 싶습니다. 나는 여전히 메인 스레드에서 내 테스트 단계를 실행하기 위해 필요로하는 대기열 내 시나리오에서 가능하다고 생각하지 않는다

p_thread = process_thread() 
p_thread.setDaemon(True) 
p_thread.start() 

# Executing all test steps here 
# test_step_1 
do_something_1() 
# test_step_n 
do_something_n() 

p_thread.run_thread = False 
p_thread.join() 

:이 모든에 의해 이루어집니다.

도움을 주시면 감사하겠습니다.

답변

0

추적 예외 모듈을 사용하여 예외를 변수로 저장할 수 있습니다.

import traceback 

class process_thread(threading.Thread): 
    def __init__(self): 
     threading.Thread.__init__(self) 
     self.run_thread = True 

    def run(self): 
     try: 
      process that may crash() 
     except: 
      self.exception_var = traceback.format_exc() 

당신은 메인 스레드에서 변수에 액세스 :

print(self.exception_var) 

를 또는 무엇이든 당신이 여기에하고 싶은 당신이 예외를 실행하고 기대하는 스레드에서보십시오. 프로세스가 충돌하는 것을 보지 않고도 이것이 정확히 원하는 것인지 확신 할 수 없습니다. 이것은 실제로 충돌하는 프로세스가 예외를 유발할 것을 요구하므로 traceback을 사용합니다. 그렇지 않은 경우 수동으로 예외를 발생시켜야 할 수 있습니다. 여기에 좋은 대답이 있습니다 : Manually raising (throwing) an exception in Python

+0

이 변수는 예외가없는 경우이 변수를 자주 물어 봐야하므로이 문제는 해결되지 않습니다. 그런 다음이 정보를 얻기 위해 정규 함수를 호출 할 수 있기 때문에 스레드에서 아무 것도 얻지 못합니다. 생성 된 데몬 스레드의 주 스레드에서 예외가 발생합니다. –

+0

자,'thread.interrupt_main()'메소드를 시도해 보았습니다. 메인 스레드에서'KeyboardInterrupt'를 트리거 할 것입니다. 여기에 링크하십시오 : https://docs.python.org/2/library/thread.html#thread.interrupt_main –

+0

감사합니다. 정확히 자기 정의 된 예외를 제기하는 것에 관해서 아무 것도 발견하지 못했기 때문에 내가 그랬던 것입니다. 최고야 –

관련 문제