當進程終止時,Python中的文件對象會發生什麼? Python是否以SIGTERM
,SIGKILL
,SIGHUP
(等)或KeyboardInterrupt
異常終止有關係嗎?當進程被終止時,如何在Python中清理文件對象?
我有一些日誌腳本不斷獲取數據並將其寫入文件。我不在乎做任何額外的清理,但我只是想確保當Python突然終止時(例如,我可以讓它在後臺運行並關閉計算機)日誌文件沒有損壞。我做了以下的測試腳本來嘗試看看會發生什麼:
termtest.sh
:
for i in $(seq 1 10); do
python termtest.py $i & export pypid=$!
sleep 0.3
echo $pypid
kill -SIGTERM $pypid
done
termtest.py
:
import csv
import os
import signal
import sys
end_loop = False
def handle_interrupt(*args):
global end_loop
end_loop = True
signal.signal(signal.SIGINT, handle_interrupt)
with open('test' + str(sys.argv[-1]) + '.txt', 'w') as csvfile:
writer = csv.writer(csvfile)
for idx in range(int(1e7)):
writer.writerow((idx, 'a' * 60000))
csvfile.flush()
os.fsync(csvfile.fileno())
if end_loop:
break
我跑termtest.sh
不同的信號(改變SIGTERM
到SIGINT
,SIGHUP
和SIGKILL
in termtest.sh
)(注意:我在termtest.py
中放置了一個明確的處理程序SIGINT
,因爲Python不能處理Ctrl+C
以外的那個)。在所有情況下,所有輸出文件都只有完整的行(沒有部分寫入),並且沒有出現損壞。我把flush()
和fsync()
調用試圖確保數據儘可能寫入磁盤,以便腳本在寫入過程中被中斷的可能性最大。
因此,我可以得出結論:Python在終止時總是完成寫操作,並且不會將文件保留在中間狀態中?還是這取決於操作系統和文件系統(我正在測試Linux和ext4分區)?