【发布时间】:2013-08-01 23:54:11
【问题描述】:
我在 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
编辑:另外,你认为我应该添加一个类似于设置删除条目的方法吗?
【问题讨论】:
-
您正在尝试重新发明锁、RLock 和信号量。您可以在 python 文档中查找这些术语。
-
你认为你为什么需要这个?不是龙卷风事件驱动的吗?当事件触发时调用处理程序,处理程序运行直到它触发,然后程序可以处理另一个事件。
-
@Hyperboreus -- 我对锁了解不多,但我知道我不能使用它们,因为 Tornado 是非阻塞的。
-
@SwiftCore:不,CPython 是最常见的 Python 解释器。 Cython 是一组用于构建 CPython 扩展模块的工具。
-
@SwiftCore,我同意abamert,但你也可以使用Cython编译python代码,据我了解。