【问题标题】:How to run some action every few seconds for 10 minutes in rails?如何在 Rails 中每隔几秒运行 10 分钟?
【发布时间】:2018-04-28 16:15:31
【问题描述】:

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

【问题讨论】:

  • 您在寻找如何构建计时器吗?或者从哪里随机选择问题?你能补充更多细节吗?
  • 请提供一些您尝试过的代码以及您认为可能有问题或遗漏的代码。 stackoverflow.com/help/how-to-ask
  • @iGian 我正在寻找构建计时器的正确方法。我想我可以使用 rufus-scheduler 每隔几秒钟运行一次操作,但我不确定将它用于我的用例是否有意义。
  • 类似12.times do send_this random_question sleep 10 end ?

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


【解决方案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

【讨论】:

    猜你喜欢
    • 2012-07-14
    • 2018-09-24
    • 2017-05-08
    • 2020-12-11
    • 2014-10-18
    • 2020-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多