0

デーモンスレッドに次のコードがあり、メインスレッドがデーモンの結合を呼び出さない場合は、メインスレッドが終了すると "with"の内部で使用されるので、ファイルは安全に閉じますか?とにかくそれを安全にするには?ありがとう:DPythonデーモンスレッドと "with"ステートメント

while True: 
    with open('file.txt', 'r') as f: 
     cfg = f.readlines() 
time.sleep(60) 

答えて

2

docsから:

注:デーモンスレッドが突然シャットダウン時に停止しています。それらのリソース(オープンファイル、データベーストランザクションなど)は適切に解放されないことがあります。スレッドを正常に停止させたい場合は、それらを非デーモンにし、イベントなどの適切なシグナリングメカニズムを使用します。

デーモンスレッドが__exit__方法および実行するfinallyブロックのためのチャンスなしで終了していること、これが示唆するが、完全な状態にはありません。私たちは、これが事実であることを確認するための実験を実行することができます:私たちはデーモンスレッドを開始し、withブロックメインスレッドが終了で寝てそれを残す

import contextlib 
import threading 
import time 

@contextlib.contextmanager 
def cm(): 
    try: 
     yield 
    finally: 
     print 'in __exit__' 

def f(): 
    with cm(): 
     print 'in with block' 
     event.set() 
     time.sleep(10) 

event = threading.Event() 

t = threading.Thread(target=f) 
t.daemon = True 
t.start() 

event.wait() 

。我々run the experiment、我々は

in with block 

が、無in __exit__の出力を取得し、その__exit__方法は、実行する機会を得ることはありません。場合には


クリーンアップが必要な場合は、デーモンスレッドを使用しないでください。通常のスレッドを使用し、通常のスレッド間通信チャネルを介してメインスレッドの最後にシャットダウンするように指示します。

+0

そのすばらしい答えをありがとう。だから本質的に私の質問によると、ファイルは読み取りモードで開いたままにしていますか?フォローアップの質問 - それはファイルを使用不可能にするか? –

+0

@SamThomas:オペレーティングシステムは、プロセスが終了したときにOSレベルでプロセスの開いているファイルハンドルを自動的に閉じる必要がありますが、書き込みモードで開いているファイルの出力バッファをフラッシュする必要はありません。 – user2357112

+0

このように、上記のように、デーモンの使用は安全ですか? –

関連する問題