如何在Scala actor内部发送延迟响应

如何在Scala actor内部发送延迟响应,scala,actor,Scala,Actor,非参与者类向参与者发送同步消息,如下所示: val response = WorkData !? "hello" 如果我想立即回复此消息,我将执行以下操作: receive { case "hello" => reply("world") } 但是如果我将来需要回复的话 如何存储呼叫者引用,然后发送回复?对当前呼叫者的引用存储在sender中。例如,替换是完全有效的 receive { case "hello" => reply("world") } 与 此后,您可以将此

非参与者类向参与者发送同步消息,如下所示:


val response = WorkData !? "hello"
如果我想立即回复此消息,我将执行以下操作:


receive {
  case "hello" => reply("world")
}
但是如果我将来需要回复的话
如何存储呼叫者引用,然后发送回复?

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

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


此后,您可以将此引用存储在可变变量中,或通过参与者循环递归传递。

对当前调用方的引用存储在
发送方
中。例如,替换是完全有效的

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


以后可以将此引用存储在可变变量中,或者递归地通过actor循环传递。

我通常会存储发送方引用以供以后使用

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

我通常会存储发件人引用以供以后使用

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

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

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

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

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,我认为如果你想在将来回复,你需要发送一条异步消息(不是与
?!
同步的消息),并且当你的参与者准备好了回复时,最简单的方法是当发送者本身也是参与者时。不幸的是,我需要大量重构,以使发送者成为参与者。我想我可以从某种程度上为发送者获取一个“未来”参考,并用它来发送回复。我认为如果你想在将来回复,你需要发送一条异步消息(而不是与
?!
同步的消息),而当发送者本身就是参与者时,参与者在准备好响应时最简单的方法就是将响应交给发送者,也是。不幸的是,我需要大量的重构,才能使发送者成为参与者。我想我可以通过某种方式为发件人获得一个“未来”参考,并用它将答案发回。发件人不是演员,我想我不能通过发件人发回消息?或者我错了?您可以将消息发送回Scala 2.8中的非参与者。发件人不是参与者,我想我不能通过发件人发送消息,而不是?或者我错了?您可以在Scala 2.8中将消息发送回非参与者