2009-10-24 92 views
15

我可以在Scala中为演员的邮箱设置最大大小吗?scala邮箱大小限制

以生产者 - 消费者问题。有了线程,我可以在缓冲区填满时阻止生产者。我看到了一些用Scala编写的生产者 - 消费者示例,他们都使用带有用作“缓冲区”的邮箱的actor。我可以设置邮箱大小,让生产者等待消费者准备好吗?任何其他优雅的解决方案,以避免无法控制的邮箱增长?

回答

16

您可以创建一个充当生产者和消费者之间缓冲区的角色。缓冲区检出其邮箱到它的循环数据。当缓冲产品的数量太高时,它向生产者发送“过载”消息;并且一旦所有事情都恢复顺序,就发送一个“清除”消息。如果消息太多,它只会丢弃传入的消息(或最老的消息)。

消费者主动向缓冲区请求产品,然后缓冲区发送一个产品。如果缓冲区为空,则消费者会一直等待输入。

生产者将产品发送给缓冲角色。如果它收到“超载”消息,它可以停止生产,或者它可以继续生产,因为知道产品可能会被丢弃。

当然这个逻辑可以直接实现到生产者或消费者本身,但是一个单独的缓冲区将允许你更容易地引入多个生产者和/或消费者。

5

Actor.mailboxSize方法返回Actor中邮箱中未决邮件的数量。

这可用于以各种方式限制生产者。

例如,一种可能性是,

生产者检查消费者的mailboxSize是大于某一阈值。如果是,则它向消费者发送SpecialMessage,并阻塞信号量。当消费者收到这个SpecialMessage它释放信号量。生产者现在可以愉快地继续它的业务。

这可以避免轮询以及任何丢弃的消息。

+1

投票似乎比让消费者的邮箱成为两个参与者之间的“共享状态”更合适。 – Zed 2009-10-25 11:38:01

+1

从纯粹的编程角度来看,轮询通常更好,但从硬件利用角度来看,信号通常更好。取决于你应该选择哪一种确切的情况。 – 2009-10-26 19:11:53

+0

@Zed消费者的邮箱是共享状态!否则制作人将无法发送任何消息给它:) – HRJ 2009-10-27 01:45:26