如何在 rails 中每隔几秒 运行 进行一些操作,持续 10 分钟?
How to run some action every few seconds for 10 minutes in rails?
我正在尝试构建类似应用程序的测验,并希望每 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.minutes,因为每个循环实际上最终休眠的时间比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
我正在尝试构建类似应用程序的测验,并希望每 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.minutes,因为每个循环实际上最终休眠的时间比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