考虑覆盖一个巨大的数据文件的以下程序。
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
永远不会丢失,因为python是os.replace
的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)
这不会导致硬链路问题,但终止信号将被忽略很长一段时间
我想我必须用第二种方法,但我不确定。哪个更好?或者你还有别的好主意吗
目前没有回答
相关问题 更多 >
编程相关推荐