gpt4 book ai didi

java - Akka scheduler() 每次重复都迟到

转载 作者:塔克拉玛干 更新时间:2023-11-02 07:51:32 26 4
gpt4 key购买 nike

我有一个简单的调度程序,每 1 秒重复一次任务:

Cancellable task = Akka.system().scheduler().schedule(
Duration.create(0, TimeUnit.MILLISECONDS),
Duration.create(1, TimeUnit.SECONDS),
actor, new TickMsg("Tick", 0, 120)
);

不幸的是,每次传递都延迟了 ticker-duration,所以最终 actor 恰好在 100 毫秒后收到 TickMsg - 好的,这在文档中有描述,我很清楚:

It does not execute tasks at the exact time, but on every tick, it will run everything that is overdue.

我无法理解的是为什么 传递都延迟,这实际上意味着每传递 1000 毫秒需要 1100 毫秒。结果,经过 10 次后,我们有 1 秒的延迟,1 分钟后为 6 秒,1 小时后为 6 分钟,依此类推......

一些解决方案是将重复持续时间设置得更短一些,这样它就不会在所需的时间间隔内延迟,例如可以工作,然后调度程序会根据需要重复任务:

Cancellable task = Akka.system().scheduler().schedule(
Duration.create(0, TimeUnit.MILLISECONDS),
Duration.create((1000 - tickerDuration/2), TimeUnit.MILLISECONDS),
actor, new TickMsg("Tick", 0, 120)
);

不幸的是,这种方式有点不舒服而且容易忘记,有没有其他方法可以每 x 秒(或其他 TimeUnit)重复一次任务而不将其转换为毫秒并缩短?

最佳答案

这在 Akka 2.1 版中已修复。

原因很简单:HashedWheelTimer 不知道重复的任务,所以任务需要重新安排自己,但由于这根据定义发生在滴答之后,它总是会迟到并落入下一个桶。修复是包括漂移校正,参见 here了解详情。

关于java - Akka scheduler() 每次重复都迟到,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14145186/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com