私はPythonの並行処理プリミティブを使って読み書きロックを書いています(私は思う!)。私がSOまたは他の場所で読んだ実装は、2つのロックを使用するように見えます.1つは読み取り用、もう1つは書き込み用です。実装には読み取り専用のモニタが1つしかありませんが、何かが欠けている可能性があります。誰かがこれが動作することを確認できますか?その場合、追加の書き込みロックを使用する利点は何ですか?基本となるロックが1つのみの読み書きロック?
これは、読者を優先する古典的な読み書きロックです(飢えたライターかもしれません)。ダミーキャッシュを使って読み書きを実演しています。
import threading as t
class ReadWriteCache(object):
def __init__(self):
self.cache = {}
self.reads = 0
self.read_cond = t.Condition(t.Lock())
def read(self, key):
with self.read_cond: # Register the read, so writes will wait()
self.reads += 1
result = self.cache[key]
with self.read_cond:
self.reads -= 1
if not self.reads:
self.read_cond.notify_all()
return result
def update(self, key, value):
with self.read_cond:
while self.reads:
self.read_cond.wait() # Wait for reads to clear
self.cache[key] = value # With read lock, update value
2ロックバージョンの例はどこにありますか? – ErikR
@ErikR、ここでいくつかの例を見つけることができます: –
@ErikR、入力が早すぎます。以下の質問を参照してください。受け入れられた回答の各リンクと、コードを使ったpasztorpistiの回答。彼らは2つのロックを使用するか、または完成時にライターとリーダーが互いに信号を送る、何らかの二重イベントシステムを持っています。 http://stackoverflow.com/questions/16261902/python-any-way-to-get-one-process-to-have-a-write-lock-and-others-to-just-read –