Ruby on rails 如何在rails中每隔几秒钟运行一次操作,持续10分钟?

Ruby on rails 如何在rails中每隔几秒钟运行一次操作,持续10分钟?,ruby-on-rails,ruby,rake,actioncable,rails-activejob,Ruby On Rails,Ruby,Rake,Actioncable,Rails Activejob,我正在尝试构建类似quizup的应用程序,并希望每10秒发送一次广播,并随机提问2分钟。如何使用rails实现这一点?我正在使用行动电缆发送广播。我可以使用rufus scheduler每隔几秒钟运行一次操作,但我不确定在我的用例中使用它是否有意义。最简单的解决方案是分叉一个新线程: Thread.new do duration = 2.minutes interval = 10.seconds number_of_questions_left = duration.seconds

我正在尝试构建类似quizup的应用程序,并希望每10秒发送一次广播,并随机提问2分钟。如何使用rails实现这一点?我正在使用行动电缆发送广播。我可以使用rufus scheduler每隔几秒钟运行一次操作,但我不确定在我的用例中使用它是否有意义。

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

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.5分钟,因为每个循环实际结束的睡眠时间略超过10秒。如果这种差异不重要,那么上述解决方案就已经足够了

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

如果使用rufus调度程序:
你在寻找如何建立计时器吗?或者从哪里随机挑选问题?您可以添加更多详细信息吗?请提供一些您尝试过的代码,以及您认为可能错误或缺失的代码@伊吉安我正在寻找一个正确的方法来建立计时器。我想我可以使用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