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

Python の呼び出し元スレッドでスレッドの例外をキャッチするにはどうすればよいですか?

Susan Sarandon
Susan Sarandonオリジナル
2024-11-09 09:25:02344ブラウズ

How to Catch a Thread's Exception in the Caller Thread in Python?

呼び出し側スレッドでスレッドの例外をキャッチする

マルチスレッド プログラミングでは、タスクが同時に実行され、複雑な操作を効率的に処理できます。ただし、スレッド内で発生した例外は管理が困難になる場合があります。 Python では、標準の「try-excel」ブロックは、子スレッドで発生した例外を処理できない場合があります。この記事では、呼び出し側スレッドのスレッドから例外をキャプチャし、開発者が例外を効果的に処理できるようにする手法について説明します。

問題を理解する

次のシナリオを考えてみましょう。スクリプトがファイルを実行します。進行状況インジケーターを表示する目的で、別のスレッドにコピーします。ただし、ファイルのコピーが失敗すると、スレッド内で例外がスローされます。以下のコード スニペットは、この例外を処理しようとします。

try:
    threadClass = TheThread(param1, param2, etc.)
    threadClass.start()   ##### **Exception takes place here**
except:
    print "Caught an exception"

残念ながら、「start」メソッドがすぐに戻り、子スレッドのコンテキストで例外が発生するため、このアプローチは失敗します。例外スタック トレースはそのスレッド内で分離されたままとなり、呼び出し元のスレッドからアクセスできなくなります。

例外の解決

この問題に対処するための有望なアプローチの 1 つは、メッセージ パッシングを使用することです。メッセージ キューを使用すると、子スレッドから呼び出し側スレッドに例外を伝えることができます。以下に実装例を示します。

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:bucket という名前のメッセージ キューに例外情報を配置するカスタム スレッド クラス。
  • main:ノンブロッキング get オペレーションを使用してキューの例外を継続的にチェックする呼び出し側スレッド。
  • exc_type、exc_obj、exc_trace: 適切に処理できる、取得された例外の内容。

結論

メッセージパッシング技術を採用することにより、子スレッドから例外を捕捉し、呼び出し側スレッドでそれらを効果的に処理することが可能になります。これにより、開発者は潜在的なエラーに迅速に対処できるようになり、より堅牢で応答性の高いマルチスレッド アプリケーションが実現します。

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

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