1

我正在使用 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

但是由于对象显然彼此完全不同,它们有不同的索引等等,我最终为每个对象编写了一个锁定函数......这几乎和根本没有这些函数并重复代码。

问题是:有没有办法编写一个通用函数来做到这一点,知道每个对象都有一个“状态”字段,将它们锁定在数据库中,保留所有索引和其他属性?或者,也许,我还没有想到另一种更简单的方法?

4

1 回答 1

1

经过更多的研究,以及在各种 IRC 频道上提出的问题,这似乎是不可行的,因为没有办法从 Riak 获取这种关于对象的元数据。

于 2013-05-03T09:21:27.673 回答