マルチスレッド プログラミングでは、タスクが同時に実行され、複雑な操作を効率的に処理できます。ただし、スレッド内で発生した例外は管理が困難になる場合があります。 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()
説明:
メッセージパッシング技術を採用することにより、子スレッドから例外を捕捉し、呼び出し側スレッドでそれらを効果的に処理することが可能になります。これにより、開発者は潜在的なエラーに迅速に対処できるようになり、より堅牢で応答性の高いマルチスレッド アプリケーションが実現します。
以上がPython の呼び出し元スレッドでスレッドの例外をキャッチするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。