デーモンスレッドに次のコードがあり、メインスレッドがデーモンの結合を呼び出さない場合は、メインスレッドが終了すると "with"の内部で使用されるので、ファイルは安全に閉じますか?とにかくそれを安全にするには?ありがとう:DPythonデーモンスレッドと "with"ステートメント
while True:
with open('file.txt', 'r') as f:
cfg = f.readlines()
time.sleep(60)
デーモンスレッドに次のコードがあり、メインスレッドがデーモンの結合を呼び出さない場合は、メインスレッドが終了すると "with"の内部で使用されるので、ファイルは安全に閉じますか?とにかくそれを安全にするには?ありがとう:DPythonデーモンスレッドと "with"ステートメント
while True:
with open('file.txt', 'r') as f:
cfg = f.readlines()
time.sleep(60)
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__
方法は、実行する機会を得ることはありません。場合には
クリーンアップが必要な場合は、デーモンスレッドを使用しないでください。通常のスレッドを使用し、通常のスレッド間通信チャネルを介してメインスレッドの最後にシャットダウンするように指示します。
そのすばらしい答えをありがとう。だから本質的に私の質問によると、ファイルは読み取りモードで開いたままにしていますか?フォローアップの質問 - それはファイルを使用不可能にするか? –
@SamThomas:オペレーティングシステムは、プロセスが終了したときにOSレベルでプロセスの開いているファイルハンドルを自動的に閉じる必要がありますが、書き込みモードで開いているファイルの出力バッファをフラッシュする必要はありません。 – user2357112
このように、上記のように、デーモンの使用は安全ですか? –