0

次のコードは私の実際のコードではありません。この質問をするのを簡単にしました。
これは、Web アプリケーションのサーバー側コードです。

私がやりたいのは、グループが変更されたときにグループをロックすることですが、方法がわかりません。
たとえば、'GroupA' に属するユーザーがサーバーにリクエストを投稿し、'GroupA' の安全性の辞書に user_id を追加したいとします。
「GroupA」に含まれる辞書のみをロックしたい。「グループ」に含まれる辞書をロックしたくありません。
「GroupB」に属するユーザーは、「GroupA」に含まれる辞書を変更することは決してないため、
アドバイスをお願いします。

# this dictionary is mutable which means new groups could be added anytime
groups = {'GroupA': {}, 'GroupB': {}, 'GroupC': {}}


def request_handler(request):
    # Assuming these come from the user's http post
    user_id = request.userid
    user_group = request.user_group

    group = groups[user_group]  # a group contains user_id's dictionary
    if user_id in group:
        # the value of the key 'user_id' is the number of the user's post
        group[user_id] = group[user_id] + 1
    else:
        group.append(user_id)
        group[user_id] = 1
4

1 に答える 1

1

グループごとに個別のロックが必要です。例えば:

groups = {'GroupA': (Threading.Lock(), {}), 'GroupB': (Threading.Lock(), {})}


def request_handler(request):
    # Assuming these come from the user's http post
    user_id = request.userid
    user_group = request.user_group

    glock, group = groups[user_group]
    with glock:
        group[user_id] = group.get(user_id, 0) + 1

グループも動的である場合は、groupsグループを追加または削除する前にロックを取得する必要があります。

他のアプローチを検討してください。

  1. dict をサブクラス化し、ロックを適切に使用するグループには、独自のマッピング クラスを使用します。
  2. グループの読み取りと更新を担当する単一のスレッドを用意します。Queues のペアを介して他のスレッドにタスクを送信させます。(これで、ロックはまったく必要ありません。)
于 2013-04-09T01:53:04.227 に答える