0

如果我在守護進程線程中有以下代碼,並且主線程沒有在守護進程上調用連接。文件是否會在主線程退出或不存在時在「with」內部使用,因此會安全關閉?無論如何,以確保安全?謝謝:dPython守護進程線程和「with」語句

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

回答

2

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__方法從來沒有得到機會運行。


如果要清理,請勿使用守護進程線程。使用普通的線程,並通過常規的線程間通信通道告訴它在主線程結束時關閉。

+0

謝謝你的回答。所以基本上根據我的問題,該文件保持打開在閱讀模式?後續問題 - 是否會導致文件無法使用? –

+0

@SamThomas:當進程退出時,操作系統應該在操作系統級別自動關閉進程的打開文件句柄,但這不一定會執行諸如在寫入模式下打開的文件的刷新輸出緩衝區之類的操作。 – user2357112

+0

那麼在這種情況下,如上所述,守護進程的使用是安全的嗎? –