Python字典和线程并发

时间:2013-08-01 23:54:11

标签: python tornado

我在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

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

1 个答案:

答案 0 :(得分: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 ()