1

Python 3 でノンブロッキング非同期スレッド websockets プロトコル (トルネード) を使用しています。グローバル レベルでは非常に保守的に辞書を使用していますが、任意の数のスレッドで更新できます (基本的に、新しいユーザーが接続したとき、それらのソケットは、辞書を介してオブジェクトにマップされます)。並行性を処理するための基本的なシステムを作成しました...しかし、それは公式の方法ではありません。ソケットはユニークなので、同じソケットに同時に値を割り当てようとしても問題はないと思いますが、規模によっては、取得しようとするなど、別の問題があるのではないかと思っていました。サイズ変更時に辞書から何か。参考までに、これが私が思いついた「同時実行修正」です。

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 に似たメソッドを追加する必要があると思いますか?

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 に答える