【问题标题】:akka: dedicated dispatcher or future?akka:专用调度员还是未来?
【发布时间】: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


【解决方案1】:

如果您最终需要比默认调度程序最大池大小更多的并发 getSynchronously() 操作,则无论哪种方式都需要专用调度程序。

但是对于你的问题,我同意@rob-starling 的观点,两者都很好并且有它们的用途。

【讨论】:

    猜你喜欢
    • 2019-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-26
    • 2015-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多