一般的にはスレッドを正常に終了するように要求することが望ましいですが、突然の終了が必要な状況もあります。 。この記事では、スレッドがそのように設計されていない場合でもスレッドを終了する方法について説明します。
推奨されるアプローチは、スレッドが定期的にチェックしてスレッドを終了する必要があるかどうかを判断する停止フラグを使用することです。 。これにより、スレッドは終了前にリソースを解放し、クリーンアップを実行できるようになります。
import threading class StoppableThread(threading.Thread): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self._stop_event = threading.Event() def stop(self): self._stop_event.set() def stopped(self): return self._stop_event.is_set()
まれに、スレッドを強制的に終了する必要がある場合があります。これは、_async_raise 関数を使用して実現できます。
def _async_raise(tid, exctype): if not inspect.isclass(exctype): raise TypeError("Only types can be raised (not instances)") res = ctypes.pythonapi.PyThreadState_SetAsyncExc(ctypes.c_long(tid), ctypes.py_object(exctype)) if res == 0: raise ValueError("invalid thread id") elif res != 1: ctypes.pythonapi.PyThreadState_SetAsyncExc(ctypes.c_long(tid), None) raise SystemError("PyThreadState_SetAsyncExc failed") class ThreadWithExc(threading.Thread): def raise_exc(self, exctype): _async_raise(self._get_my_tid(), exctype)
強制終了すると、リソースが不安定な状態になる可能性があることに注意してください。このオプションは、正常な終了が利用できない場合、またはスレッドがプログラムをアクティブにブロックしている場合にのみ使用してください。
以上がPython で実行中のスレッドを適切かつ強制的に終了するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。