代码之家  ›  专栏  ›  技术社区  ›  DannyB

rufus调度程序vs带睡眠的循环

  •  1
  • DannyB  · 技术社区  · 8 年前

    我需要尽可能频繁地在rails 5应用程序中运行activejob。

    到目前为止,我使用的是一个cron作业,它是使用while gem定义的(在过去使用过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 回复  |  直到 8 年前
        1
  •  1
  •   jmettraux    8 年前

    有区别。

    rufus调度程序 every 将尝试每1s运行一次,因此在t0+1、t0+2、t0+3等,而“睡眠”变量将在t0、t0+wt1+1、t0+wt1+1+wt2+1等运行。(其中wtn=第n次呼叫的工作时间 puts hello )

    rufus调度程序 每一个 将使用rufus调度程序工作线程,以便如果存在重叠(wt(nb)>wt(na)),则无论如何都将发生nb。这种行为可以改变(参见 job options )

    rufus调度程序 interval 更接近你的睡眠选择:

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

    它在每次运行 puts 'hello' .

    对于一个简单的do-sleep循环,我会选择sleep选项。但如果你需要更多,鲁弗斯调度有 cron , 间隔 , 每一个 并为他们调整选项。你可以安排多个工作。

    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