首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >模拟时间和Akka调度器

模拟时间和Akka调度器
EN

Stack Overflow用户
提问于 2015-11-25 11:53:16
回答 1查看 407关注 0票数 4

我正在构建一个多智能体模拟使用Akka,因此,希望运行比实时更快的模拟。具体来说,我想配置Akka调度器,这样调度器就可以从一个调度事件前进到另一个调度事件(这显然可能涉及到事件之间的时间步骤),而不是通过一些底层的固定时间步骤进行推进。

换句话说,我希望调度程序的行为就好像它是一种优先级队列,在这种队列中,优先级由事件的模拟时间戳提供。

明白了吗?如果是这样的话,我是否可以使用Actor系统的默认调度程序来执行?如果这是不可能的,那么我将如何使用现有的Akka组件来滚动我自己的调度程序来完成这个任务。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-11-25 13:12:03

我不认为这是可能的阿克卡调度程序。来自文档 (重点雷):

有时候,在未来发生事情的需要会出现,那么你会去哪里呢?只看ActorSystem!在这里,您可以找到返回akka.actor.Scheduler实例的调度程序方法,这个实例在每个ActorSystem中都是唯一的,并在内部中用于调度在特定时间点发生的事情。

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

代码语言:javascript
复制
def periodicFunction() : Unit = ???  //whatever you're doing to Agents

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

您的模拟代码可以简单地是:

代码语言:javascript
复制
@scala.annotation.tailrec
def fasterThanRealTimeLoop(n : Int) = 
  if(n > 0) {
    periodicFunction()

    fasterThanRealTimeLoop(n-1)
  }

然后,您可以模拟20次运行

代码语言:javascript
复制
fasterThanRealTimeLoop(20)

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

代码语言:javascript
复制
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)
}

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33915856

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档