我想在非常精确的时间运行一个流程。现在我正在使用延迟工作:
handle_asynchronously :make_live, :run_at => (exact_time_down_to_the_second)
但它根本不准确。例如,当我这样做时:
handle_asynchronously :make_live, :run_at => (Time.now + 30.seconds)
...它在30秒+/- 15秒内执行。后续尝试在Time.now
左右的6秒内发生,有时几乎立即发生。
有没有一种确切的方法可以做到这一点?没有坚持延迟工作。
当我这样做时:
handle_asynchronously :make_live, :run_at => Proc.new {|event| event.occurs_at }
...它运作良好(似乎将队列轮询到第二个)。即使使用短间隔(30秒)。
看起来这只是控制台测试效果不佳。
所以现在解决了我的问题。
答案 0 :(得分:0)
延迟可能是由两个因素造成的:定期对作业进行延迟作业检查。延迟作业也会按顺序执行作业,因此如果队列中已经有一些作业,则会延迟。
如果您知道并且可以提前定义任务(即与当前时间无关),请使用Whenever gem作为cronjobs的包装。
为Delayedjobs创建单独的队列还可以减少长队列导致的延迟。
您也可以切换到Resque,这就像内存中队列一样,可能会以较短的间隔检查队列。
答案 1 :(得分:0)
行。你的工作包装对你来说不够精确。我看到两个选项:
sleep until Time.now == exact_time_down_to_the_second
轰!精确执行,直至秒。
答案 2 :(得分:0)
延迟作业设置为默认情况下每5秒轮询一次数据库。你可以调整它,使它每秒轮询一次。我很好奇需要这种精确度的用例。也许有更好的解决方案?