gpt4 book ai didi

scala - Scala actor 可以同时处理多个消息吗?

转载 作者:行者123 更新时间:2023-12-03 10:01:58 24 4
gpt4 key购买 nike

The reply我最近的一个问题表明一个参与者一次处理一个消息。这是真的?我没有看到任何明确说明的内容(在 Scala 编程中),其中包含以下代码段(第 593 页)

If [the react method] finds a message that can be handled, [it] will schedule the handling of that message for later execution and throw an exception



(强调我自己的)。两个相关(且相互排斥)的问题:
  • 假设一个角色可以模拟处理多个消息,我如何强制一个角色一次处理 1 个消息(如果这是我希望做的)? (使用 receive ?)
  • 假设一个参与者一次处理一条消息,我如何最好地实现一个实际上可以同时处理消息的参与者

  • 编辑:做一些测试似乎证明我错了, Actor 确实是连续的。所以这是我需要回答的问题#2

    最佳答案

    Actor 一次处理一条消息。处理多条消息的经典模式是让一个协调器 actor 前端用于一组消费者 actor。如果您使用 react,则使用者池可能很大,但仍将仅使用少量 JVM 线程。这是一个示例,我创建了一个由 10 个消费者和一个协调员组成的池,为他们服务。

    import scala.actors.Actor
    import scala.actors.Actor._

    case class Request(sender : Actor, payload : String)
    case class Ready(sender : Actor)
    case class Result(result : String)
    case object Stop

    def consumer(n : Int) = actor {
    loop {
    react {
    case Ready(sender) =>
    sender ! Ready(self)
    case Request(sender, payload) =>
    println("request to consumer " + n + " with " + payload)
    // some silly computation so the process takes awhile
    val result = ((payload + payload + payload) map {case '0' => 'X'; case '1' => "-"; case c => c}).mkString
    sender ! Result(result)
    println("consumer " + n + " is done processing " + result )
    case Stop => exit
    }
    }
    }

    // a pool of 10 consumers
    val consumers = for (n <- 0 to 10) yield consumer(n)

    val coordinator = actor {
    loop {
    react {
    case msg @ Request(sender, payload) =>
    consumers foreach {_ ! Ready(self)}
    react {
    // send the request to the first available consumer
    case Ready(consumer) => consumer ! msg
    }
    case Stop =>
    consumers foreach {_ ! Stop}
    exit
    }
    }
    }

    // a little test loop - note that it's not doing anything with the results or telling the coordinator to stop
    for (i <- 0 to 1000) coordinator ! Request(self, i.toString)

    此代码测试以查看哪个消费者可用并向该消费者发送请求。替代方案是随机分配给消费者或使用循环调度程序。

    根据您在做什么,Scala 的 Futures 可能会更好地为您服务。例如,如果您真的不需要 Actor ,那么上述所有机制都可以写成
    import scala.actors.Futures._

    def transform(payload : String) = {
    val result = ((payload + payload + payload) map {case '0' => 'X'; case '1' => "-"; case c => c}).mkString
    println("transformed " + payload + " to " + result )
    result
    }

    val results = for (i <- 0 to 1000) yield future(transform(i.toString))

    关于scala - Scala actor 可以同时处理多个消息吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1007010/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com