1

我在python 3中使用非阻塞异步线程websockets协议(Tornado)。我在全局级别非常保守地使用字典,但它可以由任意数量的线程更新(基本上是当新用户连接时,他们的套接字通过字典映射到一个对象)。我已经制作了一个基本的系统来处理并发......但这不是任何官方方法。由于套接字是唯一的,我认为人们尝试同时为同一个套接字分配值应该没有任何问题,但我想知道是否有规模,可能还有另一个问题,例如尝试获取调整大小时字典中的内容。作为参考,这是我想出的“并发修复”。

class Routing_Table:

    def set(self, key, value):
        self.blocked = self.blocked + 1
        self.table[key] = value
        self.blocked = self.blocked - 1

    def get(self, key):
        while(self.blocked > 0):
            pass
        return self.table[key]

    def __init__(self):
        self.table = {}
        self.blocked = 0

编辑:另外,你认为我应该添加一个类似于设置删除条目的方法吗?

4

1 回答 1

2

如果你想以线程安全的方式做任何事情,基本的想法是:

class ConcurrentThingy:
    def __init__ (self):
        self.lock = Lock () # or RLock () if you want it to be reentrant    

    def concurrentlyAccessedMethod (self, *args, **kwargs):
        with self.lock: doMeanStuff ()

您的课程可能看起来像这样:

class Routing_Table:
    def set (self, key, value):
        with self.lock: self.table[key] = value

    def get(self, key):
        with self.lock: return self.table[key]

    def __init__(self):
        self.table = {}
        self.lock = Lock ()
于 2013-08-02T00:01:09.713 回答