호출자 스레드에서 스레드 예외 잡기
Python에서 멀티스레드 프로그래밍은 하위 스레드에서 발생하는 예외를 처리하는 데 어려움을 겪습니다. 하위 스레드에서 예외가 발생하면 해당 스레드에만 국한되어 호출자 스레드가 예외를 캡처하고 처리하기가 어렵습니다.
핵심 문제 및 근거
주요 문제는 thread_obj.start() 메서드의 즉시성에 있습니다. 이 메서드는 자체 컨텍스트 및 스택에서 하위 스레드의 실행을 시작합니다. 결과적으로 하위 스레드 내에서 발생하는 모든 예외는 호출자 스레드로 다시 전파되지 않습니다.
문제 극복
이 문제를 해결하려면 다음을 사용하는 효과적인 기술이 필요합니다. 메시지 전달. 이 접근 방식에서는 하위 스레드와 호출자 스레드 간에 통신 채널이 설정되어 하위 스레드가 상위 스레드에 예외 정보를 전달할 수 있습니다.
구현
아래는 하위 스레드 예외를 캡처하여 호출자에 표시하는 방법을 보여주는 예 thread:
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()
설명
이 예에서 ExcThread 클래스는 예외 생성을 담당하는 하위 스레드 역할을 합니다. main() 함수는 호출자 스레드 역할을 합니다. 통신 채널은 queue.Queue() 객체(코드에서는 버킷이라고 함)를 사용하여 설정됩니다.
ExcThread의 run() 메서드 내에서 발생하는 모든 예외는 버킷에 배치됩니다. 호출자 스레드는 루프에서 버킷을 지속적으로 확인합니다. 버킷에서 예외를 사용할 수 있으면 이를 검색하고 예외의 세부 정보(유형, 개체 및 역추적)가 인쇄됩니다.
이 접근 방식은 하위 스레드와 호출자 스레드 간의 통신 격차를 효과적으로 연결합니다. , 후자가 전자에서 생성된 예외를 포착하고 처리할 수 있도록 합니다.
위 내용은 Python의 하위 스레드에서 발생한 예외를 잡는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!