在计划任务系统中,following() 函数负责根据设定的规则安排任务的执行时间。该函数遵循一个简单的规则:任务将在 due + k * interval 的时间点执行,其中 due 是初始的执行时间,interval 是两次执行之间的时间间隔,k 是一个从 0 开始递增的整数。然而,在实际操作中,当任务执行失败导致需要重试时,系统会将 next_run_at 设置为 now + 60s,这里的 now 是当前时间。这一改变会使得原本的执行网格发生变化,因为新的 next_run_at 也会成为下一次执行的 due。由于任务的 request_key 是基于 due 生成的,这意味着即使任务看起来像是重试,它实际上使用的是一个新的 request_key,从而在任务调度上被视为一个全新的任务。以下是一个具体的场景来复现这个问题:假设任务计划在 10:00 执行,间隔为 60 分钟。如果在 10:00 任务执行时队列已满,任务实际上会在 10:01 执行。从这一刻起,任务的执行时间将调整为 11:01、12:01,以此类推。这个过程中,任务的执行时间虽然看起来是按照原计划的间隔执行的,但由于 due 的改变,任务的 request_key 也随之改变,导致系统实际上在处理一个不同的任务实例。
本博客所有文章除特别声明外,均采用
CC BY-NC-SA 4.0
许可协议。转载请注明来自KernelSU分享库 !
评论已关闭