ホームページ > バックエンド開発 > Python チュートリアル > Python マルチスレッドで子スレッドから例外をキャッチするにはどうすればよいですか?

Python マルチスレッドで子スレッドから例外をキャッチするにはどうすればよいですか?

Patricia Arquette
リリース: 2024-11-22 10:49:11
オリジナル
818 人が閲覧しました

How to Catch Exceptions from Child Threads in Python Multithreading?

Python マルチスレッドでのスレッド例外のキャッチ

Python では、マルチスレッドにより複数のタスクを同時に実行できます。ただし、子スレッド内で例外を処理すると、例外が別のコンテキストで発生するため、課題が生じます。

問題の説明

子スレッドが例外をスローする場合、それは問題ではありません。親スレッドに直接引っかかります。 thread_obj.start() メソッドはすぐに戻りますが、子スレッドは独立して動作します。

Queue と sys.exc_info() を使用した解決策

例外情報を返すには親スレッドへのメッセージの受け渡しにキューを使用できます。次に例を示します。

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. 子スレッド (ExcThread) が例外を発生させます。
  2. 子スレッドの "run" メソッド内で、例外情報は、sys.exc_info() を使用してキューに配置されます。
  3. 親スレッド内(メイン)、ループは例外がないかキューを継続的にチェックします。
  4. ループ内で例外が捕捉された場合、検査のために出力されます。

このアプローチにより、親スレッドが許可されます。子スレッドからの例外を効果的に処理します。

以上がPython マルチスレッドで子スレッドから例外をキャッチするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート