2017-09-08 1 views
1

매우 간단한 스크립트입니다.스레딩 세트 데몬이 작동하지 않습니다.

test.py

import temp 
temp.start() 

temp.py

import threading, time 
f=open("output.txt","w") 
def temp(): 
    for i in range(5): 
     f.write(str(i)) 
     time.sleep(5) 
    f.close() 
def start(): 
    t=threading.Thread(target=temp) 
    t.setDaemon(True) 
    t.start() 
내가 test.py 종료 주와 daemon 스레드가 종료를 immediately.But 및처럼 행동하지 않는 주요 과정으로 완료 데몬 스레드를 예상

a daemon. 내가 여기에 기본적인 것을 놓치고있어?

+2

왜 스레드가 '완료'합니까? 도스는 매우 명확하게 보입니다. "데몬 스레드는 시스템 종료시 갑작스럽게 중단됩니다. 열린 파일, 데이터베이스 트랜잭션 등의 리소스가 제대로 릴리스되지 않을 수도 있습니다. 스레드를 정상적으로 중지하려면 데몬스트림이 아닌 데몬틱하게 만들고 사용하십시오. 이벤트와 같은 적절한 신호 메커니즘 " – pvg

+0

@martineau 그러면 주 프로세스는 스레드 완료를 기다립니다. – vks

+1

아니요, 프로그램 종료입니다. '데몬 스레드'는 기본적으로 '파이썬 런타임을 종료 할 때이 스레드를 고려하지 마십시오'라는 의미입니다. 그냥 버려졌습니다. – pvg

답변

2

이것은

https://docs.python.org/3/library/threading.html

에서 파이썬 문서 일부 상세히 설명되는 가장 중요한 비트가 :

스레드

는 "디먼 스레드"로 플래그 될 수있다. 이 플래그의 의미는 데몬 스레드 만 남아있을 때 전체 Python 프로그램이 종료된다는 것입니다.

데몬 스레드가 갑자기 종료시 중지됩니다. 그들의 리소스 (오픈 파일, 데이터베이스 트랜잭션 등과 같은 )는 으로 적절하게 공개되지 않을 수 있습니다.

이 약간 혼동하지만 그것이 무엇으로 귀결 것은 만들 수있는 용어 '데몬'과 부정의 뒤틀림의 오버로드 : 파이썬 프로그램은 데몬을 제외하고, 전체의 모든 스레드 후 를 종료 다른 비 데몬 스레드가 남아 있지 않으면 단순히 종료되는 스레드. 귀하의 경우에는 프로그램이 아무 것도 할 수있는 기회를 갖기 전에 데몬 스레드를 죽이는 것을 종료한다는 의미입니다 (반대로, setDaemon(false) 인 경우 스레드가 완료 될 때까지 종료되지 않습니다).

+0

문서가 "... 데몬 특성은 현재 스레드에서 상속되었습니다"라고 했으므로 주 스레드가 OP의 경우'setDaemon (false) '를 호출 할 필요가 없습니다. 게다가'setDaemon()'은 ** Old ** getter/setter API의 일부이므로 속성을 직접 설정하는 것이 "현대적인"방법입니다. – martineau

+0

@martineau 일반적으로, 포스터가 한 것만 큼 대답이 포함되어 있지 않습니다. (포스터가 그 비트로 주석을 삭제 한 것을 눈치 챘지만, 그 이유는 우리가'setDaemon'에 대해 계속하는 이유입니다) – pvg

관련 문제