ホームページ  >  記事  >  バックエンド開発  >  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-excel ブロッ​​クは機能しません:

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 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。