我正在使用Riak数据库来存储我的Python应用程序对象,这些对象由多个脚本并行使用和处理。因此,我需要将它们锁定在不同的地方,以避免被同时处理多个脚本,如:
riak_bucket = riak_connect('clusters')
cluster = riak_bucket.get(job_uuid).get_data()
cluster['status'] = 'locked'
riak_obj = riak_bucket.new(job_uuid, data=cluster)
riak_obj.add_index('username_bin', cluster['username'])
riak_obj.add_index('hostname_bin', cluster['hostname'])
riak_obj.store()
问题是,这是一个相当多的代码来做一个简单,可重复的事情,并且考虑到锁定经常发生的事实,我想找到一种更简单,更清晰的方法。我曾尝试编写一个函数来执行锁定/解锁,就像那样(对于另一个对象,称为“build”):
def build_job_locker(uuid, status='locked'):
riak_bucket = riak_connect('builds')
build = riak_bucket.get(uuid).get_data()
build['status'] = status
riak_obj = riak_bucket.new(build['uuid'], data=build)
riak_obj.add_index('cluster_uuid_bin', build['cluster_uuid'])
riak_obj.add_index('username_bin', build['username'])
riak_obj.store()
# when locking, return the locked db object to avoid fetching it again
if 'locked' in status:
return build
else:
return
但由于对象显然彼此完全不同,它们有不同的索引等等,我最终为每个对象编写了一个锁定函数...这几乎与没有函数一样麻烦并重复代码。
问题是:有没有办法编写一个通用函数来做到这一点,知道每个对象都有一个'status'字段,它将它们锁定在db中保留所有索引和其他属性?或者,或许,还有另一种更容易想到的方法吗?
答案 0 :(得分:1)
经过一些更多的研究,以及在各种IRC频道上提出的问题,似乎这是不可行的,因为无法从Riak获取有关对象的这种元数据。