2

私は測定装置に話しかけています。私は基本的にコマンドを送信し、応答を受け取ります。ただしask、コマンドを送信して回答を読み返すメソッドを提供しています。このメソッドをロックすると、呼び出されたメソッドreadwriteロックが原因でデッドロックが発生します。ロックしないと、別のスレッドが答えを盗んだり、読んでいる前に書いたりする可能性があります。これをどのように実装しますか?

import threading

class Device(object):
    lock = threading.Lock()
    def ask(self, value):
        # can't use lock here would block
        self.write(value) # another thread could start reading the answer
        return self.read()

    def read(self):
        with self.lock:
            # read values from device

    def write(self, value):
        with self.lock:
            # send command to device
4

2 に答える 2

3

threading.RLock()1 つのスレッド内での競合を避けるために使用します。

再入可能ロックは、同じスレッドによって複数回取得される可能性がある同期プリミティブです。内部的には、プリミティブ ロックで使用されるロック/ロック解除状態に加えて、「所有スレッド」と「再帰レベル」の概念を使用します。ロック状態では、一部のスレッドがロックを所有しています。ロックされていない状態では、それを所有するスレッドはありません。

于 2012-11-23T16:02:57.590 に答える
1

threading.RLock() オブジェクトを使用して再入可能ロックを行うことができます。しかし、そのようにコードを書き直す方が良いです。RLock は必要ありません。たとえば、write()、read() からロックを削除し、ask() を同様の方法で書き換えることができます。

    with self.lock:
        self.write(value)
        r = self.read()
    return r

古いバージョンの Python の RLock() は、実装がより複雑であるため、動作が遅くなります。

また、作成したコードでは、すべてのインスタンスに対して 1 つのロックを取得することに注意してください。適切な場合もありますが (たとえば、デバイスが 1 つしかなく、インスタンスが多数ある場合)、一般的にはそうではありません。インスタンスごとに異なるロックが必要な場合は、その初期化を __init__() メソッドに入れます。

于 2012-11-23T16:30:10.730 に答える