【问题标题】:Simulating time and Akka schedulers模拟时间和 Akka 调度程序
【发布时间】:2015-11-25 11:53:16
【问题描述】:

我正在使用 Akka 构建多智能体模拟,因此希望以比实时更快的速度运行模拟。具体来说,我想配置 Akka 调度程序,以便调度程序从一个调度事件推进到下一个调度事件,而不是按某个底层固定时间步长推进(这显然可能涉及事件之间的显着不同的时间步长)。

稍微不同的是,我希望调度程序表现得好像它是一种优先级队列,其中优先级由事件的模拟时间戳给出。

这清楚吗?如果是这样,我想使用 Actor 系统的默认调度程序来实现吗?如果这是不可能的,那么我将如何使用现有的 Akka 组件来滚动我自己的调度程序来完成这项任务。

【问题讨论】:

  • 必须是调度器吗?为什么不只是一个向您的代理发送消息的递归函数?
  • @RamonJ.RomeroyVigil 对不起,我没有关注。你能提供更多关于你的想法的描述吗?
  • 我会用一个例子写一个答案。如果不是您要查找的内容,我可以随时删除...

标签: scala akka scheduler


【解决方案1】:

我认为这对于 akka 调度程序是不可能的。来自documentation(强调我的):

有时需要让事情在未来发生,并且 那你去哪里看?没有比 ActorSystem 更进一步的了!你在那里 找到返回实例的调度程序方法 akka.actor.Scheduler,这个实例对于每个 ActorSystem 都是唯一的,并且是 在内部用于安排在特定时间发生的事情 及时

但是,您始终可以使用递归函数完成相同的任务。假设您的“实时”功能如下所示:

def periodicFunction() : Unit = ???  //whatever you're doing to Agents

//periodicFunction is called every 10 seconds
actorSystem.scheduler().schedule(0 seconds, 10 seconds)(periodicFunction())

您的模拟代码可以是:

@scala.annotation.tailrec
def fasterThanRealTimeLoop(n : Int) = 
  if(n > 0) {
    periodicFunction()

    fasterThanRealTimeLoop(n-1)
  }

然后你可以模拟 20 次运行

fasterThanRealTimeLoop(20)

此功能可以进一步封装以封装这两种可能性:

val realtimeMode : Boolean = ??? //some configuration setting

val periodicArgs : Either[FiniteDuration, Int] = 
  if(realtimeMode) Left(10 Seconds) else Right(20)

periodicArgs.left.foreach { period => 
  actorSystem.scheduler().schedule(0 seconds, period)(periodicFunction())
}

periodicArgs.right.foreach { count => 
  fasterThanRealTimeLoop(count)
}

此代码现在将根据配置设置调用正确类型的循环(定时或尽可能快)。

【讨论】:

  • @RamonJ.RomeroyVigil 谢谢。我认为这个递归函数调用不适用于我想做的事情。我想,我想要的是让 Akka 调度程序表现得像一个优先级队列,其中队列中的对象按照模拟时间排序。
  • @davidrpugh 欢迎您。正如我在回答顶部所说的那样,我认为调度程序没有它的技巧。快乐的黑客攻击。
猜你喜欢
  • 1970-01-01
  • 2013-01-17
  • 1970-01-01
  • 2019-09-20
  • 2014-09-04
  • 2015-04-04
  • 1970-01-01
  • 1970-01-01
  • 2012-05-01
相关资源
最近更新 更多