我正在使用 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
但是由于对象显然彼此完全不同,它们有不同的索引等等,我最终为每个对象编写了一个锁定函数......这几乎和根本没有这些函数并重复代码。
问题是:有没有办法编写一个通用函数来做到这一点,知道每个对象都有一个“状态”字段,将它们锁定在数据库中,保留所有索引和其他属性?或者,也许,我还没有想到另一种更简单的方法?