Rufus Scheduler vs Loop with Sleep

时间:2018-06-04 11:08:57

标签: ruby-on-rails rufus-scheduler

我需要尽可能多地在我的Rails 5应用程序中运行ActiveJob。

到目前为止,我使用的是一个使用when gem定义的cron作业(过去使用过Crono)。

这种方法会在整个rails应用程序执行之前启动它,然后关闭并重新执行它。我希望避免它,而是有一个持久的“服务”来完成这项工作。

我撞到了Rufus Scheduler宝石,看起来不错,但后来我开始想知道我是否需要它。

所以,我的问题是:

以下这两个选项之间是否存在任何有意义的差异:

# With Rufus
scheduler = Rufus::Scheduler.new
scheduler.every('1s') { puts 'hello' }
scheduler.join

# Without Rufus
loop { puts "hello" ; sleep 1 }

请注意,这些脚本中的任何一个都将以rails runner my_scheduler.rb作为docker容器执行,并且任何解决方案都必须确保作业仅运行一次(从不并行运行两次)。

1 个答案:

答案 0 :(得分:1)

存在差异。

Rufus-scheduler every将尝试每1秒运行一次,所以在t0 + 1,t0 + 2,t0 + 3等等。而#34; sleep"变体将在t0,t0 + wt1 + 1,t0 + wt1 + 1 + wt2 + 1,...(其中wtN =第{N}个puts hello的工作时间)运行。

Rufus-scheduler every将使用rufus-scheduler工作线程,这样如果存在重叠(wt(Nb)> wt(Na)),则无论如何都会发生Nb。可以更改此行为(请参阅job options)。

Rufus-scheduler interval更接近您的睡眠选项:

scheduler.interval('1s') { puts 'hello' }

它在puts 'hello'的每次运行之间放置1秒(或任何你想要的时间间隔)。

对于一个简单的do-sleep-loop,我选择了sleep选项。但是如果你需要更多,rufus-scheduler有cronintervalevery和调整选项。你可以安排多个工作。

scheduler.cron('0 1 1 * *') do
  # every first of the month at 1am
  flush_archive
end
scheduler.cron('0 8,13,19 * * mon-fri') do
  # every weekday at 8am, 1pm, 7pm
  clean_dishes
end
scheduler.interval('1s') do
  puts 'hello'
end