0
如果我在守護進程線程中有以下代碼,並且主線程沒有在守護進程上調用連接。文件是否會在主線程退出或不存在時在「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
塊運行的機會。我們可以運行一個實驗來驗證這種情況:
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()
,我們啓動一個守護線程,讓它在with
塊主線程退出時睡覺。當我們run the experiment,我們得到的
in with block
但沒有in __exit__
的輸出,所以__exit__
方法從來沒有得到機會運行。
如果要清理,請勿使用守護進程線程。使用普通的線程,並通過常規的線程間通信通道告訴它在主線程結束時關閉。
謝謝你的回答。所以基本上根據我的問題,該文件保持打開在閱讀模式?後續問題 - 是否會導致文件無法使用? –
@SamThomas:當進程退出時,操作系統應該在操作系統級別自動關閉進程的打開文件句柄,但這不一定會執行諸如在寫入模式下打開的文件的刷新輸出緩衝區之類的操作。 – user2357112
那麼在這種情況下,如上所述,守護進程的使用是安全的嗎? –