Reader 在 Akka 中使用 Actor 模型的 Writer Lock
Reader Writer Lock using Actor Model in Akka
我想使用 actor 模型实现著名的 reader writer 模型。我们可以有多个 reader 阅读,但只有一个作家可以写作。同样,当一个作者没有写 reader 可以阅读,反之亦然。
为了解决这个问题,我想到了使用监督演员,它为 reader 演员维护一个集合,并为作家演员维护一个队列。现在,当 reader 的集合为空时,写入器可以出列并开始写入。此外,当作者完成所有 reader 组演员可以开始阅读。
我们能否有一个更好的问题来解决这个使用演员模型的著名问题?
此模型是否也比使用读锁或写锁解决的原始 reader 写入器问题更好?
您可能想要使用 ScalaSTM 库研究 "software transactional memory"。
您将创建一个具有原子访问权限的共享 Ref。当多个线程进入一个原子块时,两者都会继续。第一个写入 Ref 的线程获胜,失败者从头开始重新启动原子块(并因此重新读取)。因此,两个线程将始终使用最新数据。
https://nbronson.github.io/scala-stm/
STM 是 Locks 和 Mutexes 的替代品,但具有更好的并发性,因为它使用乐观的非阻塞写入,而不是同时阻塞写入和读取。编写和维护STM代码也比使用锁更容易。
您可以简单地创建一个主管角色来管理传入的请求。
然后主管 Actor 可以向 reader 个 Actor 发送消息。当 readers 发送确认回写请求时,可以转发给 writer Actors。
我想使用 actor 模型实现著名的 reader writer 模型。我们可以有多个 reader 阅读,但只有一个作家可以写作。同样,当一个作者没有写 reader 可以阅读,反之亦然。
为了解决这个问题,我想到了使用监督演员,它为 reader 演员维护一个集合,并为作家演员维护一个队列。现在,当 reader 的集合为空时,写入器可以出列并开始写入。此外,当作者完成所有 reader 组演员可以开始阅读。
我们能否有一个更好的问题来解决这个使用演员模型的著名问题?
此模型是否也比使用读锁或写锁解决的原始 reader 写入器问题更好?
您可能想要使用 ScalaSTM 库研究 "software transactional memory"。
您将创建一个具有原子访问权限的共享 Ref。当多个线程进入一个原子块时,两者都会继续。第一个写入 Ref 的线程获胜,失败者从头开始重新启动原子块(并因此重新读取)。因此,两个线程将始终使用最新数据。
https://nbronson.github.io/scala-stm/
STM 是 Locks 和 Mutexes 的替代品,但具有更好的并发性,因为它使用乐观的非阻塞写入,而不是同时阻塞写入和读取。编写和维护STM代码也比使用锁更容易。
您可以简单地创建一个主管角色来管理传入的请求。 然后主管 Actor 可以向 reader 个 Actor 发送消息。当 readers 发送确认回写请求时,可以转发给 writer Actors。