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