【发布时间】:2016-08-09 23:41:26
【问题描述】:
我使用 Python 的并发原语编写了一个读写锁(我想!)。我在 SO 或其他地方阅读的每个实现似乎都使用 2 个锁——一个用于读取,另一个用于写入。我的实现只包含一个用于读取的监视器,但我可能遗漏了一些重要的东西——任何人都可以确认这会起作用吗?如果是这样,使用额外的写锁有什么好处?
这是经典的读写锁,读者偏好(可能会饿死作者)。我使用一个虚拟缓存来演示读写。
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
【问题讨论】:
-
在哪里可以找到双锁版本的示例?
-
@ErikR,你可以在这里找到一些例子:
-
@ErikR,输入太早了。请参阅下面的问题。接受的答案中的每个链接,以及 pasztorpisti 的代码答案。它们要么使用 2 个锁,要么具有某种双事件系统,在此系统中,写入者和读取者都在完成时相互发出信号。 stackoverflow.com/questions/16261902/…
标签: python multithreading concurrency locking