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()
説明:
このアプローチにより、親スレッドが許可されます。子スレッドからの例外を効果的に処理します。
以上がPython マルチスレッドで子スレッドから例外をキャッチするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。