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应该在操作完成时回复发送者.
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将请求发送给其他参与者进行处理.
| 归档时间: |
|
| 查看次数: |
11469 次 |
| 最近记录: |