【问题标题】:scala mailbox size limitscala邮箱大小限制
【发布时间】:2009-10-24 10:17:49
【问题描述】:

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

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

【问题讨论】:

    标签: memory scala size overflow limit


    【解决方案1】:

    您可以创建一个actor,充当生产者和消费者之间的缓冲区。缓冲区将其邮箱签出到其循环数据。当缓冲的产品数量过多时,它会向生产者发送一条“过载”消息;并在一切恢复正常后发送“明确”消息。如果消息太多,它只会丢弃传入的消息(或最旧的消息)。

    消费者主动从缓冲区请求产品,而缓冲区又发回一件产品。如果缓冲区为空,消费者会一直等待输入。

    生产者将产品发送到缓冲区参与者。如果它收到“过载”消息,它可以停止生产,也可以继续生产,因为它知道产品可能会被丢弃。

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

    【讨论】:

      【解决方案2】:

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

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

      例如,一种可能性是,

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

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

      【讨论】:

      • 轮询对我来说似乎比让消费者的邮箱成为两个参与者之间的“共享状态”更合适。
      • 从纯编程的角度来看,轮询通常更好,但从硬件利用率的角度来看,信号量通常更好。取决于你的具体情况,应该选择哪个。
      • @Zed 消费者邮箱处于共享状态!否则生产者将无法向其发送任何消息:)
      猜你喜欢
      • 2013-06-10
      • 2019-01-09
      • 2012-04-05
      • 1970-01-01
      • 2013-06-04
      • 2016-11-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多