ruby-on-rails - 如何在 Rails 中每隔几秒运行一些 Action 10 分钟?

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

我正在尝试构建类似应用程序的测验,并希望每 10 秒发送一次广播,随机问题持续 2 分钟。我如何使用 rails 做到这一点?我正在使用 Action 电缆发送广播。我可以使用 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. 分钟的总运行时间,因为每个循环实际上最终会休眠 10 秒多一点。如果这种差异不重要,那么上述解决方案就已经足够了。
  • 此外,这种调度程序只存在于内存中,而不是像 sidekiq 这样的专用后台 worker 。 .因此,如果 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
    

    关于ruby-on-rails - 如何在 Rails 中每隔几秒运行一些 Action 10 分钟?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50078563/

    相关文章:

    css - Bootstrap 导航栏如何使其全屏显示

    mysql - 无法在 Rails 上运行数据库迁移

    Ruby:irb 无法在 Windows 上运行

    ruby-on-rails - rake db :migrate doesn't work after ruby 2. 2.2 到 2.2.3 通过 RVM 升级

    ruby-on-rails - rake 中止! NameError:使用 rake db:migrate 时出现未初始化常量 ActiveRecord::VERSION 错误

    ruby-on-rails - 配置 Controller 但出现错误 ActionNotFound

    mysql - Ruby on Rails - 找不到 mysql2.so

    ruby-on-rails - Rails, Facebook API, Koala gem — 获取页面为 'Like' 的用户的所有配置文件

    ruby - 特定类别的 IRB 输出静音

    ruby - 如何在 Ruby 脚本中运行 Rake 任务?