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

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

Susan Sarandon
Susan Sarandon원래의
2024-11-09 12:06:02143검색

How to Catch Child Thread Exceptions in a Parent Thread in Python?

멀티스레드 Python 애플리케이션에서 예외 처리

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()

이 예에서는

  1. 예외를 공유하기 위해 대기열 버킷이 생성됩니다.
  2. ExcThread는 버킷을 참조하여 초기화됩니다.
  3. 메인 스레드는 대기열의 예외를 지속적으로 확인합니다.
  4. 예외가 발견되면 메인 스레드는 스레드는 이를 적절하게 처리할 수 있습니다.

메시지 전달을 사용하면 스레드 간 예외에 대한 효율적인 통신이 가능합니다.

위 내용은 Python의 상위 스레드에서 하위 스레드 예외를 잡는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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