2012-05-01 4 views
1

파이썬에서 내가 만든 스레드에 대한 참조를 가지고 있지 않을 때 나쁘다 : threading.Thread(target=worker_method)? 가비지 콜렉터가 응용 프로그램의 안정성에 영향을주는 내용을 처리 할 수 ​​있습니까?파이썬의 가비지 수집기가 내 애플리케이션에 해를 끼치고 있습니까?

+1

이 경우 GC가 피해를주지 않아야합니다. 오히려 당신의 디자인/코드입니다. –

+0

실을 시작하십니까? –

+0

스레드가 계속 실행되지만 더 이상 처리하지 않아도됩니다. 중지 하시겠습니까? – jdi

답변

1

스레드는 관계없이 계속 실행되지만, 단점은 스레드와 통신하기 위해 더 이상 스레드에 대한 핸들이 없다는 것입니다.

간단한 테스트 스레드 객체가 범위를 벗어나 경우에도, 그 여전히 실행 보여줍니다 :

from threading import Thread 
from time import sleep 

def t_func(): 
    print "Sleeping" 
    sleep(5) 
    print "Done Sleeping" 

def test(): 
    t = Thread(target=t_func) 
    t.start() 

>>> test() 
Sleeping 
Done Sleeping 

당신이 바로 그것을 시작한 후 t 스레드 개체를 삭제했다하더라도, 그것은 계속 실행됩니다. 그러나 실제로 시작한 스레드를 추적해야하며, 완료되었는지 또는 살아 있는지 모니터링해야합니다. 그리고 필요하다면 깨끗이 셧다.

+1

참조가없는 것이 항상 단점은 아닙니다. 풀 스레드 인 경우 앱의 수명 동안 실행되고 대기열 또는 앱의 나머지 부분과 완전히 독립적으로 작동하는 스레드를 통해 통신하는 다른 스레드 클래스는 왜 참조를 유지합니까? –

+0

@MartinJames : 네가 그렇습니다. 스레딩의 고급 응용 프로그램에서 뭔가 다른 것이 관리되고 있거나 통신 경로를 제공하고있는 상황이 있습니다. 내가 생각하기에 간단한 응용 프로그램에 대해 더 많은 것을 고수했다. – jdi

관련 문제