我正在一個我認爲可能會失敗的不可靠系統上進行項目。我想要保證的是,如果我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