python原子_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')

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值