考虑以下覆盖大量数据文件的程序。
with open('datafile', 'w') as f:
for i in range(100000):
line = 'x' * 1000 + '\n'
f.write(line)
如果您在写作时键入Control-C,之前的datafile
竞赛将会丢失,并且只会写入部分新内容。我找到了两种避免数据丢失的解决方案。第一种是使用os.replace
。
import os
with open('tmpfile', 'w') as f:
for i in range(100000):
line = 'x' * 1000 + '\n'
f.write(line)
os.replace('tmpfile', 'datafile')
这样,datafile
永远不会丢失,因为os.replace
的python assures the atomicity。但是,如果存在datafile
的硬链接,则会保留旧内容。
第二个是导致程序终止的陷阱信号。
import signal
# makes exit signals ignored and returns the previous handlers
def ignore_exit_signals():
signals = [signal.SIGHUP, signal.SIGINT, signal.SIGQUIT, signal.SIGTERM]
handler_dictionary = {}
for sig in signals:
handler_dictionary[sig] = signal.getsignal(sig)
signal.signal(sig, signal.SIG_IGN)
return handler_dictionary
def restore_exit_signal_handlers(handler_dictionary):
for sig, handler in handler_dictionary.items():
signal.signal(sig, handler)
handler_dictionary = ignore_exit_signals()
with open('datafile', 'w') as f:
for i in range(100000):
line = 'x' * 1000 + '\n'
f.write(line)
restore_exit_signal_handlers(handler_dictionary)
这不会导致硬链接问题,但终止信号会被忽略很长时间。
我认为我必须使用第二种方式,但我不确定。哪个更好?或者你有另一个好主意吗?