在Akka询问和告诉的区别?

blu*_*sky 11 asynchronous scala akka

阅读Scala文档我很难理解ask和tell之间的区别.

http://doc.akka.io/docs/akka/snapshot/scala/actors.html声明:

!意思是"发射并忘记",例如异步发送消息并立即返回.也称为告诉.

?异步发送消息并返回表示可能的回复的Future.也称为问.

如果我正在使用的演员产生一个web请求,那么ask和tell之间有什么区别?在这两种情况下,请求都将异步生成并且必须等待响应,换句话说,如果actor正在调用Web服务并等待响应,那么"tell"如何立即返回?

Ric*_*ose 12

ask和之间的区别tell是从消息发送者(不一定是演员)的角度来看.ask将发送消息并返回一个可以等待超时或收到回复的未来,tell将发送消息并立即返回.

在这种情况下ask,接收消息的actor应该在操作完成时回复发送者.

  • 对,就是这样。两者都立即返回——tell 返回 `Unit`,也就是说什么也没有,所以不需要返回值。“ask”返回一个“Future[Any]”,它可以被“await”,或通过管道传输到另一个参与者,或“映射”到要执行的回调。“ask”要复杂得多,是通过隐式转换为“akka.pattern.AskableActorRef”来实现的 (2认同)

Ami*_*ico 12

听起来你已经知道ask和之间的基本区别tell,但是不明白如何tell使用其他参与者来处理HTTP请求.

为了tell在HTTP请求处理程序中使用它是有意义的,您必须使用不要求请求处理程序返回其响应的HTTP服务器. Spray就是这样一个HTTP服务器.

在Spray中,请求处理程序不返回其响应; 给它一个RequestContext对象,响应请求涉及调用它的一些方法.您可以简单地将RequestContext发送给另一个actor,然后该actor可以响应请求:

path("foo") {
  rc => rc complete "foo"  // respond here
} ~
path("bar") {
  rc => barActor ! DoBar(rc)  // send it to bar; NO RESPONSE HERE
}
Run Code Online (Sandbox Code Playgroud)

然后barActor提到的演员可以说

case DoBar(rc) =>
  rc complete "bar"  // respond here, in another actor
Run Code Online (Sandbox Code Playgroud)

事实上Spray将请求上下文打包成一个可以传递给任何actor并从任何actor完成的对象,这非常适合于actor模型.另一方面,如果您的Web框架要求被调用的处理程序返回响应,那么如果您想要涉及另一个actor,您唯一的选择就是使用ask.

Typesafe宣布Play将很快使用Spray.我希望这意味着可以Play将请求发送给其他参与者进行处理.