Programing/Error Handling2010. 8. 23. 12:26
에러 종류
AssertionError : thread already started

의문점
분명 스레드 목록에서 해당 스레드가 사라져 있는데
Thread 객체를 살펴보니
_Thread__started 는 true로 되어있음
_Thread__stopped 역시 true(이쪽은 스레드가 종료되었으니 당연히 맞는 말이겠고)
그래서 다시 Thread.start(self)를 호출하니 스레드가 이미 시작되었다는 에러가
흠.. 그렇다고 Thread.__init__(self)를 다시 호출하고 start를 호출하면
이번엔 Thread not found 에러가 발생

아, started는 과거형이라서 한번 start를 호출하면 그대로 true로 되어 있는건가
으음.....

@결과
기존에는 스레드를 사용하는 클래스
들이 Thread를 상속받아서 스레드를 동작시키고 있었음.
class Class1 (Thread) :
def __init__ (self) :
Thread.__init__(self)
Thread.start()

def Restart (self) :
Thread.join()
Thread.__init__(self)
Thread.start()

위의 방법에서 아래의 방식으로 변경.
class Class1 :
def __init__ (self) :
self.m_thread = threading.Thread(target=self.run)
self.m_thread.start()
def Restart (self) :
self.m_thread.join()
self.m_thread = threading.Thread(target=self.run)
self.m_thread.start()

아래의 코드로 변경하니 제대로 스레드를 다시 시작시킴

음... 아직 안되는 정확한 이유는 모르겠는데
Thread를 상속받아서 사용하는건 아마 그 상속 때문에 Thread.__init__(self)이 제대로 수행되지 않은듯하다
디버깅하면서 봤을때는 다시 init되는것처럼 보였으나, 스레드 이름만 변경되고
Thread.__started, Thread.__stopped는 false가 아닌 true 그대로 유지되고 있었다

두번째 방법으로 멤버변수를 만들어 덮어 씌우는 형식으로 변경하니 Thread가 제대로 다시 생성되었음
Posted by ratiel