我需要尽可能多地在我的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容器执行,并且任何解决方案都必须确保作业仅运行一次(从不并行运行两次)。
答案 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有cron
,interval
,every
和调整选项。你可以安排多个工作。
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