python - 只有一个底层锁的读写锁?

标签 python multithreading concurrency locking

我已经使用 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

最佳答案

您没有使用单个锁。
您正在使用锁和条件变量

self.read_lock = t.Condition(t.Lock())

条件变量也是并发原语。比锁更复杂的一种。

注意:请不要调用条件变量对象read_lock

编辑: 你的代码对我来说似乎是正确的,因为它解决了 First readers-writers problem 。正如你所说,这可能会让作家挨饿。这不是一个小问题。读写器背后的逻辑是读取可能比写入多
额外的锁可以解决第二个读取器-写入器问题,写入器不会挨饿。事实上,当有作者等待资源时,读者就必须等待。

关于python - 只有一个底层锁的读写锁?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38862104/

相关文章:

Android:AsyncTask 如何使用等待/通知

python - 更多的标题困惑。为什么信号量这么慢?

java - 如何在 Java 中执行键值映射的线程安全时间点快照?

python - 根据值的条件对数据框中的列重新排序

java - 采访任务: Limit number of concurrent requests with tokens

java - 下面的递归任务的实现是否正确?

c# - 同步事件

python - 带有一些额外值的 django 签名项目

python - 序列化程序验证函数未调用 DRF

python - 使用 PyQt,监 window 口大小和调整布局的首选(有效)方法是什么?