我正在一个我认为可能会失败的不可靠系统上进行项目。我想要保证的是,如果我write_state并且机器在操作中失败,那么read_state将会读取有效状态或根本没有状态。我已经实现了一些我认为会起作用的东西 - 如果有人知道其中的一种,我有兴趣批评该解决方案或其他解决方案。Python中的原子状态存储?
我的想法:
import hashlib, cPickle, os
def write_state(logname, state):
state_string = cPickle.dumps(state, cPickle.HIGHEST_PROTOCOL)
state_string += hashlib.sha224(state_string).hexdigest()
handle = open('%s.1' % logname, 'wb')
handle.write(state_string)
handle.close()
handle = open('%s.2' % logname, 'wb')
handle.write(state_string)
handle.close()
def get_state(logname):
def read_file(name):
try:
f = open(name,'rb')
data = f.read()
f.close()
return data
except IOError:
return ''
def parse(data):
if len(data) < 56:
return (None, '', False)
hash = data[-56:]
data = data[:-56]
valid = hashlib.sha224(data).hexdigest() == hash
try:
parsed = cPickle.loads(data)
except cPickle.UnpicklingError:
parsed = None
return (parsed, valid)
data1,valid1 = parse(read_file('%s.1'%logname))
data2,valid2 = parse(read_file('%s.2'%logname))
if valid1 and valid2:
return data1
elif valid1 and not valid2:
return data1
elif valid2 and not valid1:
return data2
elif not valid1 and not valid2:
raise Exception('Theoretically, this never happens...')
例如为:
write_state('test_log', {'x': 5})
print get_state('test_log')
不应该调用file.close() FSYNC?或者它不同步? – sbirch 2010-11-19 01:49:43
不是。 fsync意味着阻塞,直到它碰到磁盘。这是很昂贵的,因为它激活了磁盘。如果你有大量的数据传入,它也会很慢,并且它必须在你的文件可以写入之前写入(ext3的data = ordered保证)。关闭便宜且异步。 – Tobu 2010-11-19 02:01:02
为什么不只是fsync文件本身? – sbirch 2010-11-19 03:02:42