スレッドを突然終了する方法はありますか?
フラグやセマフォに依存せずに実行中のスレッドを終了することは、通常、Python では推奨されません潜在的な結果のため。ただし、以下で説明するように、特定のシナリオでは、スレッドの強制終了が必要になる場合があります。
制御されていないスレッドの終了
スレッドを突然停止すると、問題が発生する可能性があります。例:
理想的には、スレッドは終了要求信号を受信すると正常に終了するように設計される必要があります。これは、スレッドが終了する必要があるかどうかを判断するために定期的にチェックする共有フラグを使用して実現できます。
説明:
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()
強制スレッド終了
外部ライブラリを扱う場合など、特定のシナリオでは、次のことが必要になる場合があります。スレッドを強制的に終了します。これは、特定のスレッドで例外を発生させることができる次のコードを使用して実現できます。
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 _get_my_tid(self): if not self.is_alive(): raise threading.ThreadError("the thread is not active") if hasattr(self, "_thread_id"): return self._thread_id for tid, tobj in threading._active.items(): if tobj is self: self._thread_id = tid return tid raise AssertionError("could not determine the thread's id") def raise_exc(self, exctype): _async_raise( self._get_my_tid(), exctype )
強制スレッド終了の制限
このメソッドには制限があり、スレッドが Python インタープリターの外部でコードを実行している場合、機能しない可能性があります。信頼性の高いクリーンアップを実現するには、スレッドで特定の例外をキャッチし、適切なアクションを実行することをお勧めします。
以上がPython のスレッドは突然終了する可能性がありますか? 終了した場合の制限は何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。