Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/343.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python字典和线程并发_Python_Tornado - Fatal编程技术网

Python字典和线程并发

Python字典和线程并发,python,tornado,Python,Tornado,我在Python3中使用非阻塞异步线程websockets协议(Tornado)。我在全局级别非常保守地使用字典,但它可以由任意数量的线程更新(基本上,当新用户连接时,他们的套接字通过字典映射到对象)。我已经建立了一个处理并发的基本系统。。。但这不是任何官方方法。由于套接字是唯一的,我不认为人们试图同时为同一个套接字赋值时会有任何问题,但我想知道,如果使用scale,可能会有另一个问题,例如在调整大小时试图从字典中获取某些内容。作为参考,这里是我提出的“并发修复” class Routing_T

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

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

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

如果您想以线程安全的方式执行任何操作,基本思想是:

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 ()

您正在尝试重新设计锁、rlock和信号量。您可以在python文档中查找这些术语。您认为为什么需要这些术语?龙卷风不是由事件驱动的吗?当一个事件触发时,会调用一个处理程序,该处理程序一直运行到触发为止,然后程序可以处理另一个事件。@Hyperboreus--我对锁知之甚少,但我知道我不能使用它们,因为Tornado是非阻塞的。@SwiftCore:不,CPython是最常见的Python解释器。Cython是一套用于为CPython构建扩展模块的工具。@SwiftCore,我同意abamert,但据我所知,您也可以使用Cython编译python代码。访问和设置字典项并不能保证是原子的。
STORE\u SUBSCR
可能只有一个操作码,但它可能会调用任何任意函数事实上,它必须这样做,才能散列您的密钥。对不起,我还没有上过操作系统课程(我完成算法后就要上这门课),但我认为为了锁定,您必须控制线程?所以,如果龙卷风正在制造线,那么我不能这样做?如果没有,我会这样做,因为它比自己编写代码更干净。@SwiftCore:如果龙卷风正在制造线程,你可以做到这一点……只是你最终可能会打破Tornado所做的一些假设。@SwiftCore和@hyperboreus没有提到的是,你应该始终将
一起使用,以防出现异常情况,锁仍然会被锁定release@SwiftCore请看我的编辑。Eiyiroüvon Kauyf,abarnert我希望我提供的补丁类确实是thread sage,否则请纠正我。