0

以下代码不是我的真实代码。我问这个问题很简单。
这是 Web 应用程序的服务器端代码。

我想做的是在修改组时锁定组,但我不知道如何。
例如,属于“GroupA”的用户向服务器发布了请求,我想将 user_id 添加到“GroupA”安全字典中。
我只想锁定“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 回答