轻松查询:如何在Rails中精确安排工作?

时间:2012-05-15 05:20:39

标签: ruby-on-rails delayed-job

我想在非常精确的时间运行一个流程。现在我正在使用延迟工作:

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秒)。

看起来这只是控制台测试效果不佳。

所以现在解决了我的问题。

3 个答案:

答案 0 :(得分:0)

延迟可能是由两个因素造成的:定期对作业进行延迟作业检查。延迟作业也会按顺序执行作业,因此如果队列中已经有一些作业,则会延迟。

如果您知道并且可以提前定义任务(即与当前时间无关),请使用Whenever gem作为cronjobs的包装。

为Delayedjobs创建单独的队列还可以减少长队列导致的延迟。

您也可以切换到Resque,这就像内存中队列一样,可能会以较短的间隔检查队列。

答案 1 :(得分:0)

行。你的工作包装对你来说不够精确。我看到两个选项:

  1. 更准确地更换或修改作业包装器。 Resque可能会有所帮助,或者您可以在Delayed :: Job内部进行调查以更频繁地轮询作业。可行,但我更喜欢这个黑客:
  2. 在您需要运行之前将作业计划60秒。将您执行作业所需的确切时间作为参数传递。然后,运行sleep until Time.now == exact_time_down_to_the_second
  3. 轰!精确执行,直至秒。

答案 2 :(得分:0)

延迟作业设置为默认情况下每5秒轮询一次数据库。你可以调整它,使它每秒轮询一次。我很好奇需要这种精确度的用例。也许有更好的解决方案?