scala邮箱大小限制
题
我可以在Scala中设置演员邮箱的最大大小吗?
采取生产者 - 消费者问题。使用线程,我可以在缓冲区填满时阻止生成器。我看到了一些用Scala编写的生产者 - 消费者示例,他们都使用带有邮箱的actor作为“缓冲区”。我可以设置邮箱大小以使生产者等待消费者准备好吗?任何其他优雅的解决方案,以避免无法控制的邮箱增长?
解决方案
您可以创建一个充当生产者和消费者之间缓冲区的角色。缓冲区将其邮箱检出其循环数据。它发回“过载”。当缓冲产品的数量太高时向生产者发送消息;并发送“清除”一旦所有内容都恢复正常,如果消息太多,它只会丢弃传入的消息(或最旧消息)。
消费者主动从缓冲区请求产品,缓冲区又发回一个产品。如果缓冲区为空,则消费者会一直等待输入。
生产者将产品发送到缓冲区actor。如果它收到“过载”,消息它可以停止生产,或者它可以继续生产,知道产品可能会被丢弃。
当然,这种逻辑可以直接实现到生产者或消费者本身,但是一个单独的缓冲区将允许您更容易地引入多个生产者和/或消费者。
其他提示
Actor.mailboxSize
方法返回Actor邮箱中的待处理邮件数。
这可以用于以各种方式限制制作人。
例如,一种可能性是,
生产者检查消费者的 mailboxSize
是否大于某个阈值。如果是,则它将 SpecialMessage
发送给使用者,并阻塞信号量。当消费者收到此 SpecialMessage
时,它会释放信号量。制作人现在可以愉快地继续它的业务。
这可以避免轮询以及任何丢弃的消息。
不隶属于 StackOverflow