如何在rails中每隔几秒钟运行一次10分钟的动作?

时间:2018-04-28 16:15:31

标签: ruby-on-rails ruby rake actioncable rails-activejob

我正在尝试像app一样构建quizup,并希望每隔10秒发送一次随机问题广播2分钟。我如何使用rails?我正在使用动作电缆发送广播。我可以使用rufus-scheduler每隔几秒运行一次动作,但我不确定将它用于我的用例是否有意义。

1 个答案:

答案 0 :(得分:1)

最简单的解决方案是分叉一个新线程:

Thread.new do
  duration = 2.minutes
  interval = 10.seconds
  number_of_questions_left = duration.seconds / interval.seconds

  while(number_of_questions_left > 0) do
    ActionCable.server.broadcast(
      "some_broadcast_id", { random_question: 'How are you doing?' }
    )
    number_of_questions_left -= 1
    sleep(interval)
  end
end

说明:

  • 这只是一个简单的解决方案,实际上你的总运行时间超过2分钟,因为每个循环实际上最终睡眠时间超过10秒。如果这种差异不重要,那么上面的解决方案已经足够了。

  • 此外,这种调度程序仅保留在内存中,而不是像sidekiq这样的专用后台工作程序。因此,如果rails进程被终止,那么所有当前正在运行的“循环”代码也将被终止,这可能是你有意想要或不想要的。

如果使用rufus-scheduler

number_of_questions_left = 12

scheduler = Rufus::Scheduler.new

# `first_in` is set so that first-time job runs immediately
scheduler.every '10s', first_in: 0.1 do |job|
  ActionCable.server.broadcast(
    "some_broadcast_id", { random_question: 'How are you doing?' }
  )
  number_of_questions_left -= 1
  job.unschedule if number_of_questions_left == 0
end