2016-11-02 4 views
0

파이썬 스레드의 "데몬"플래그를 이해하려고합니다. 알겠습니다.스레딩 : 스레드가 작업을 끝내기 전에 종료합니다.

스레드가 "데몬 스레드"로 플래그 될 수 있습니다. 이 플래그의 의미는 데몬 스레드 만 남아있을 때 전체 Python 프로그램이 종료된다는 것입니다. 초기 값은 작성 스레드에서 상속됩니다.

내 경우에는 파이썬 프로그램이 데몬 스레드가 남아 있고 스레드가 작업을 끝내기 전에 종료됩니다.

def ThreadDecorator(f): 
    def wrap(*args,**kargs): 
     t=Thread(target=f,args=args,kwargs=kargs) 
     t.daemon=True 
     t.start() 
return wrap 

@ThreadDecorator 
def runSomething(*args,**kwargs): 
    i = 0 
    attente = 0 
    fileName=kwargs['file'] 
    f=open(fileName,'wt') 
    while i < 50000: 
     f.write(str(i)+"\n") 
     # attente += 0.2 
     # attente += random.randint(1, 60)/100 
     # time.sleep(attente) 
     i += 1 
    f.close() 
    return "Finished" 

그리고 메인 프로그램

runSomething("5",file='test1.txt') 
runSomething("6",file='test2.txt') 

첫 번째 스레드 쓰기 번째 메인 블록이 pool을 포함해야 내가 느끼는 어떤 수

+0

견적이 동작을 설명합니다 : 주에 대한

작업은, 아래가 종료됩니다 포스트를 시작하는 것입니다. 메인 쓰레드가 종료되면 ('runSomething'을 호출 할 때) 데몬 쓰레드는 종료/종료됩니다. – Holloway

+0

그래서 나는 그것들을 틀린 것으로 표시해야합니까? –

+0

비 데몬 스레드에서 생성 된 경우 기본값으로 '거짓'이지만 완료되기까지 계속 실행되도록하려면 yes로 설정하십시오. – Holloway

답변

0

를 작성하지 않는 동안 만 5000 첫 번째 정수. 모든 스레드가 완료되면 pool.close()을 호출하여 모든 스레드가 실행을 완료했는지 확인할 수 있습니다.

from multiprocessing import Pool 
from datetime import datetime 

pool = Pool(processes = 2) 
num_workers = 2 
curr_worker = 1 
val = 5 
if (curr_worker < num_workers): 
    file_name = 'test'+str(curr_worker)+'.txt' 
    pool.apply_async(run_Something,args=(val,file_name,))) 
    curr_worker += 1 
    val += 1 
else: 
    pool.close() 
    pool.join() 
    curr_worker = 1 
    val = 5 
print ("Workers returned result", datetime.now().strftime('%Y-%m-%d %H:%M:%S')) 

메인은 데몬 스레드를 시작한 후에 종료됩니다. 데몬 스레드는 비 데몬 메인 종료시 중지되므로 test1.txt에만 5000 개의 레코드가 있음을 알 수 있습니다. 당신이 추가

runSomething("5",file='test1.txt') 
runSomething("6",file='test2.txt') 
관련 문제