我在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
编辑:另外,你认为我应该添加类似于设置的方法来删除条目吗?
答案 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 ()