鲁弗斯调度程序与睡眠循环



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

到目前为止,我使用的是使用 whenever 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 容器执行,并且任何解决方案都必须确保作业仅运行一次(从不并行运行两个(。

有差异。

Rufus调度器every将尝试每1秒运行一次,因此在t0 + 1,t0 + 2,t0 + 3等。虽然"睡眠"变体将以 t0、t0 + wt1 + 1、t0 + wt1 + 1 + wt2 + 1 运行,...(其中 wtN = 第 N 次调用puts hello的工作时间(。

Rufus-schedulerevery将使用 rufus-scheduler 工作线程,因此如果存在重叠(wt(Nb(> wt(Na((,Nb 无论如何都会发生。可以更改此行为(请参阅作业选项(。

Rufus调度程序interval更接近您的睡眠选项:

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

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

对于一个简单的睡眠循环,我会选择睡眠选项。但是如果你需要更多,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

最新更新