2016-11-02 31 views
0

私はpythonスレッドの "daemon"フラグを理解しようとしています。 私はスレッド:スレッドがジョブを終了する前に終了する

スレッドは「デーモンスレッド」としてフラグを立てることができることを知っています。この フラグの意味は、デーモンスレッド だけが残っていると、Pythonプログラム全体が終了するということです。初期値は作成スレッドから継承されます。

私の場合は、デーモンスレッドが残っていてスレッドが作業を終わらないうちに、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

もしそれらが非デーモンスレッドから生成されていれば、それらはデフォルトでは 'False'ですが、完了するまで実行を続けたい場合は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') 
関連する問題