2014-02-18 4 views
6

악마 스레드를 만드는 파이썬 코드가 있습니다. 상위 스레드는 거의 즉시 종료되지만 데몬 스레드는 인쇄를 계속 유지합니다.상위 스레드가 종료 될 때 파이썬 데몬 스레드가 종료되지 않습니다.

import threading 
import time 
def int_sleep(): 
    for _ in range(1, 600): 
     time.sleep(1) 
     print("sleep") 

def main(): 
    thread = threading.Thread(target=int_sleep) 
    thread.daemon = True 
    thread.start() 
    time.sleep(2) 
    print("main thread end...") 

thread = threading.Thread(target=main) 
thread.start() 

sys.version :

'3.3.3 (v3.3.3:c3896275c0f6, Nov 18 2013, 21:19:30) [MSC v.1600 64 bit (AMD64)]' 

인쇄 :

sleep 

main thread end... 

sleep 

sleep 

sleep 

이유는 무엇입니까하지 파이썬 데몬 스레드 종료 부모 스레드가 종료?

+0

체크 아웃 thread.daemon 설정 파이썬 테스트 .. http://stackoverflow.com/questions/4330111/python-thread -daemon-property –

답변

5

파이썬 스레드에 thread.daemon = True을 지정하면 데몬 만 남아있는 즉시 프로그램이 중단됩니다. stdout에 전송 된 명령은 손실됩니다.

은 다음과 같이라는 파일 main.py에

import threading 
import time 

def int_sleep(): 
    for _ in range(1, 600): 
    time.sleep(1) 
    print("sleep") 

def main(): 
    thread = threading.Thread(target=int_sleep) 
    thread.daemon = True 
    thread.start() 
    time.sleep(2) 
    print("main thread end...") 

thread = threading.Thread(target=main) 
thread.daemon = True 
thread.start() 

실행을이 추가 :

[email protected]:~/code/python/run01$ python --version 
Python 2.7.6 
[email protected]:~$ python main.py 
[email protected]:~$ 

스레드가 시작하기 때문에 아무것도 출력하지 참조하십시오. 데몬으로 설정하고 시작했습니다. 그런 다음 프로그램이 종료되었습니다.

추가 노트 :이 코드를 파이썬 인터프리터에 붙여 넣으면 데몬이 절대로 stdout에 대한 연결을 잃지 않으므로 모든 인쇄 문이 터미널에 나타납니다.

자세히보기 : 완성도를 들어 http://docs.python.org/2/library/threading.html

+1

메인 스레드를 데몬으로 설정해야하는 이유는 무엇입니까? 이 스크립트를 구현하면 스레드가 실행에 멈추었을 경우 모든 스레드 (우리의 경우 데몬 스레드)는 2 초의 수면 타이머를 종료합니다. – user3388884

+0

안녕하세요,이 정확한 스크립트를 실행 해 보았습니다. 인쇄 ... – user3388884

+0

그것은 프로그램으로 아니라 터미널에 붙여 넣기 때문입니다. 위의 현상을 설명했습니다. –

3

이 문서를 확인하십시오. https://joeshaw.org/2009/02/24/605/

모니터링은 데몬 스레드 내에서 수행되었습니다. 파이썬 문서는 만 말 :

오른쪽 꽤 좋은 소리
A thread can be flagged as a “daemon thread”. The significance 
of this flag is that the entire Python program exits when only 
daemon threads are left. 

? 이 스레드는 때로는 일부 데이터를 가져 오는 일 뿐이며 프로그램이 종료 될 때 특별한 작업을 수행 할 필요가 없습니다. 그래, 내가 물건을 믿을 때 도 기억 난다. 어쨌든 진정으로 동시 인에서 파이썬을 방지하는 글로벌 통역 잠금에도 불구하고

는 파이썬 런타임이 자신의 눈물 다운 프로세스를 시작한 후 데몬 스레드가 여전히 실행할 수있는 매우 현실적인 가능성이 있습니다. 이 프로세스의 한 단계는 인 것처럼 보입니다. globals() 내부의 값을 None으로 설정하면 모듈 의 결과로 인해 AttributeError가 NoneType을 참조 해제하려고 시도합니다. 이로 인해 TypeError가 발생합니다.

버그가 수정되었거나 버그가 여전히 존재하는지 또는 디자인 당 동작 중인지 확실하지 않습니다. 그러나 이상하게 여기는 것을 본다면 머리 뒤쪽에 이것을 보관하십시오.

그래서 다른 방법은 종료 할 때 메인에서 설정할 수있는 이탈 플래그에서 하위 스레드를 반복하는 것입니다. 그런 다음 주 스레드가 죽을 때까지 기다렸다가 정리하십시오.

0

파이썬 쉘에서을 수행 한 경우 OP ('sleep'의 출력 종료) 에 의해 설명 된 동작 만 재현 할 수 있습니다. 파일에서 실행하면 예상대로 작동합니다 (수면 '수면'과 '주 스레드 끝 ...'의 한 줄)

마찬가지로 두 번째 프로그램은 파일로 실행하면 즉시 종료되지만 파이썬 셸에서 실행할 때 끝내지 않는 'sleep'문을 출력합니다.

결론 : 파이썬 쉘인 스레드는 "메인"이 완료된 후에도 계속 실행되므로 파이썬 쉘에서 실행할 때 데몬이 종료되는 것을 방지합니다.

버그로 간주 될 수 있습니까 (예 : Python의 동작이 스크립트 실행 방식에 따라 다름) 또는 예상 되나요? 나는 BTW

... 더 많은 경험 Pythonistas에 연기 - 3.2.3

관련 문제