Python에서 멀티스레드 프로그래밍을 사용하면 작업을 동시에 실행할 수 있습니다. 그러나 다중 스레드 컨텍스트에서는 예외 처리가 어려울 수 있습니다. 이 문서에서는 특정 문제를 다룹니다. 즉, 상위 스레드에서 하위 스레드에서 발생하는 예외를 포착하는 것입니다.
문제는 하위 스레드가 자체 컨텍스트 및 스택과 독립적으로 작동하기 때문에 발생합니다. 하위 스레드에서 발생한 예외는 상위 스레드에 즉시 표시되지 않습니다. 아래와 같이 상위 스레드의 기존 try-제외 블록은 작동하지 않습니다.
try: threadClass.start() ##### **Exception takes place here** except: print "Caught an exception"
이 문제를 해결하기 위해 메시지 전달을 활용할 수 있습니다. 하위 스레드는 대기열과 같은 공유 데이터 구조를 사용하여 상위 스레드에 예외 정보를 보낼 수 있습니다.
import sys import threading import queue class ExcThread(threading.Thread): def __init__(self, bucket): threading.Thread.__init__(self) self.bucket = bucket def run(self): try: raise Exception('An error occured here.') except Exception: self.bucket.put(sys.exc_info()) def main(): bucket = queue.Queue() thread_obj = ExcThread(bucket) thread_obj.start() while True: try: exc = bucket.get(block=False) except queue.Empty: pass else: exc_type, exc_obj, exc_trace = exc # deal with the exception print exc_type, exc_obj print exc_trace thread_obj.join(0.1) if thread_obj.isAlive(): continue else: break if __name__ == '__main__': main()
이 예에서는
메시지 전달을 사용하면 스레드 간 예외에 대한 효율적인 통신이 가능합니다.
위 내용은 Python의 상위 스레드에서 하위 스레드 예외를 잡는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!