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()

問題は、これは 1 つの単純で反復可能なことを行うためのかなりのコードであり、ロックが頻繁に発生するという事実を考えると、それを行うためのより単純でクリーンな方法を見つけたいということです。そのように、ロック/ロック解除を行う関数を作成しようとしました(「ビルド」と呼ばれる別のオブジェクト用):

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 に答える