【发布时间】:2014-03-18 17:35:39
【问题描述】:
我有一堆需要与后台系统同步通信的 Actors (Akka 2)。
让 Actors 使用单独的专用调度程序并像这样同步执行处理是否有问题
def receive = {
case Foo(foo) => sender ! getFooSynchronously(foo)
case Bar(bar) => sender ! getBarSynchronously(bar)
}
或者我应该像下面这样使用期货?
def receive = {
case Foo(foo) => Future { getFooSynchronously(foo) } pipeTo sender
case Bar(bar) => Future { getBarSynchronously(bar) } pipeTo sender
}
如果我没记错的话,使用 Futures 将允许并行向 Actor 询问 Foo 和 Bar 并加入结果,这在同步方法中是不可能的。考虑到我不需要并行处理:使用专用调度程序并避免创建期货是否更有效?
【问题讨论】:
-
只要你知道前者会block你的
receive方法并且你的actor在同步调用完成之前不会处理更多的消息,它可能是一个完全有效的决定。 -
我同意使用单独的调度程序来“防火墙”关闭这些同步/阻塞参与者是一个好主意。您希望避免在 Actor 系统的主调度程序中阻塞行为,但是当您有必须阻塞的 Actor 时,这种方法是可以的。
标签: scala akka dispatcher future