>  기사  >  백엔드 개발  >  Python의 하위 스레드에서 발생한 예외를 잡는 방법은 무엇입니까?

Python의 하위 스레드에서 발생한 예외를 잡는 방법은 무엇입니까?

Susan Sarandon
Susan Sarandon원래의
2024-11-09 20:12:02828검색

How to Catch Exceptions Raised in Child Threads in Python?

호출자 스레드에서 스레드 예외 잡기

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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.