【问题标题】:Distributed readers-writer lock in pythonpython中的分布式读写锁
【发布时间】:2020-07-04 09:26:58
【问题描述】:

我正在寻找一个readers-writer lock,可以在分布式系统中的python中使用。

到目前为止,我发现:

  1. redlock,基于redis。不提供读写锁。
  2. dask 的分布式包提供lock,但同样没有读写锁。
  3. kazoo,与 Zookeeper 一起使用,offers a readers-writer lock。然而 Zookeeper 是一个非常严重的依赖项,因为它是用 Java 编写的,因此需要 JDK。

有没有比 kazoo / Zookeeper 更轻量级的替代品?理想情况下是经过实战考验的纯 Python 解决方案?

【问题讨论】:

  • 这个模块可以帮助你github.com/veshboo/redisrwlock 吗?
  • 也许......但最后一次更改是在 3 年前,我会说它没有维护。我需要向后移植到 python 2.7。
  • 我觉得要求应该更精确一些。允许哪些通信机制?需要什么排队规则?如果一个节点在持有锁的情况下宕机或分布式系统被分区,恢复期望是什么?
  • @DimaTisnek 感谢您的评论。通信:我想我可以使用 IP 和端口连接到一些服务,类似于在 redlock 中完成的方式。无需加密。排队规则:理想的作家优先。恢复预期:当一个节点宕机时,它持有的任何锁都会被释放。我很好,不用为分布式系统分区的情况做好准备。你觉得这能澄清你的问题吗?

标签: python python-2.7 locking distributed


【解决方案1】:

Redis 是单线程的,读/写操作是原子的;这意味着多个同时的读/写操作将不会成功,并且读取器和写入器将以原子方式顺序获取对资源的访问。我相信如果将资源作为 redis 数据结构之一保存,这将解决您的问题。当使用 redis 和 python 作为资源保存在 redis 中的组合时,您不需要单独的读写器锁定机制。

希望对你有帮助

【讨论】:

  • 您能说明如何做到这一点吗?我想组织对我的资源的访问,以便读者可以同时访问它,而作者只能按顺序访问。如果作者有访问权,那么读者就没有。如果作者请求访问,则不会授予读者新的访问权限(“作者优先级”)。
  • 如果你的关键资源位于redis;那么您不必特别担心使用锁来保护它的访问权限,因为无论是读取还是写入,redis 都会按顺序执行所有命令;由于 redis 是内存数据库,因此此类操作的吞吐量非常高。请再次注意,这适用于作为 redis 数据结构保存的关键资源。此外,redis 还支持事务等概念;甚至事务都是按顺序执行的;请参考这里redis.io/topics/transactions
  • 此外,当您使用 redis 进行此类活动时,您可能无法解决第二个或第三个读者作者问题(参考 en.wikipedia.org/wiki/Readers%E2%80%93writers_problem);用于确保没有进程/线程会饿死。根据设计,redis 将饿死任何待处理的命令(读或写),直到当前命令执行完成。但是,如果不详细了解您手头的问题,就很难即时提出解决方案。但是redis将无法解决您需要作家优先的要求。
  • 我的意思是与您分享,作为后端的 redis 不符合您对写优先级锁定的要求,因为它受设计限制。因此,您可以将 redis 留在您对后端选择的追求中。尝试 memchaced 或任何其他方式。
猜你喜欢
  • 2014-05-27
  • 1970-01-01
  • 2011-01-25
  • 2022-05-13
  • 2011-12-04
  • 2010-09-19
  • 2018-03-30
  • 2016-09-16
相关资源
最近更新 更多