【问题标题】:How to send a delayed response inside Scala actor如何在 Scala 演员中发送延迟响应
【发布时间】:2011-04-22 13:25:43
【问题描述】:

非actor类向actor发送同步消息,如下所示:

val response = WorkData !? "hello"

如果我想立即回复此消息,我会这样做:

receive { case "hello" => reply("world") }

但如果我以后需要回复,比 我如何存储调用者参考,然后发送回复?

【问题讨论】:

  • 我想如果你以后想回复,你需要发送一条异步消息(不是与?!同步的消息),最简单的方法是让你的演员在什么时候交出回复当发送者本身也是演员时,它就准备好了。
  • 不幸的是,我需要进行大量重构,才能使发件人成为演员。我想我可以以某种方式为发件人获得“未来”参考,并用它来发回答案。

标签: scala actor


【解决方案1】:

对当前调用者的引用存储在sender。例如,替换是完全有效的

receive {
  case "hello" => reply("world")
}

receive {
  case "hello" => sender ! "world"
}

以后您可以将此 ref 存储在可变变量中,或者递归地通过 actor 的循环。

【讨论】:

  • 发件人不是演员,我想我不能通过发件人发回消息吗?还是我错了?
  • 您可以在 Scala 2.8 中向非参与者发送消息
【解决方案2】:

我通常存储发件人参考以供以后使用。

receive {
  case "hello" => 
    val otherParty = sender
    // more receives, etc
    // ...
    otherParty ! "world"   
}

【讨论】:

    【解决方案3】:

    只生成一个处理消息并在消息准备好时响应的匿名参与者怎么样?这样,接收者只是充当调度者。这不需要可变变量来存储任何内容,因为您在这里使用了闭包。

    import scala.actors.Actor                                                              
    import scala.actors.Actor._
    
    case class Message(msg: String)
    
    class MyReceiver extends Actor {
      def act() {
        react {
          case Message(msg) =>
            actor {
              sender ! process(msg)
            }   
        }   
      }
    
      def process(msg: String): String =
        "Result: " + msg 
    }
    
    object Main {
      def main(args: Array[String]) {
        val a = new MyReceiver
        a.start()
    
        val res = a !? Message("foo")
        println(res)
      }
    }
    

    问候,raichoo

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-13
      • 1970-01-01
      • 2018-12-19
      • 1970-01-01
      • 2016-01-20
      • 1970-01-01
      相关资源
      最近更新 更多