우아한 스레드 종료
스레드를 갑자기 종료하는 것은 일반적으로 권장되지 않으며, 특히 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()
이 예에서는 stop()을 호출하여 스레드에 신호를 보냅니다. 종료하고 Join()을 사용하여 정상적으로 완료될 때까지 기다립니다.
강제 종료
예외적인 경우 강제로 스레드를 종료해야 할 수도 있습니다. 그러나 이는 최후의 수단으로 고려해야 합니다.
강제 종료 방법:
import ctypes import inspect 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(): # Note: self.isAlive() on older version of Python raise threading.ThreadError("the thread is not active") # do we have it cached? if hasattr(self, "_thread_id"): return self._thread_id # no, look for it in the _active dict 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 )
이 방법은 PyThreadState_SetAsyncExc 함수를 사용하여 특정 작업에서 예외를 발생시킵니다. 실. 그러나 이 방법은 완전히 신뢰할 수 없으며 스레드가 Python 인터프리터 외부의 시스템 호출에 있는 경우 실패할 수 있다는 점에 유의하는 것이 중요합니다.
주의:
위 내용은 Python에서 스레드를 정상적으로 종료하는 방법과 강제 종료가 필요한 경우는 언제입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!