【问题标题】:How can I run a controller method as a background task?如何将控制器方法作为后台任务运行?
【发布时间】:2009-11-13 17:28:23
【问题描述】:

我听说过各种后台任务工具(delayed_job、starling、workling 等),但从这些工具看来,它们实际上只能运行基于模型的方法(例如 User.update_counters)。

我需要能够运行控制器方法,因为它是一组非常复杂的任务,其中交织着大量其他控制器方法和自定义类。

这是一个 CPU 密集型进程,可能需要大约 5-10 分钟才能运行,所以我希望它运行时不会干扰其他用户的“正常”站点操作。

我是否误解了其他工具的工作原理?或者还有什么我没有考虑的?

【问题讨论】:

    标签: ruby-on-rails ruby background scheduled-tasks


    【解决方案1】:

    公认的做事方式是将所有复杂逻辑移至模型中,并让控制器仅用于指导请求和响应。这就是“胖模型和瘦控制器”理论所说的。将复杂的逻辑移到模型类(不一定是 ActiveRecord 类)中,并且您可以让后台工具调用 rake 任务。

    【讨论】:

      【解决方案2】:

      如果您确实需要运行控制器操作,那么您可以使用 cron 和 wget 或 curl。但我建议将您的复杂逻辑移到模型或库中,这样您就可以使用您提到的其中一种后台工具在控制器外部调用它。

      【讨论】:

      • 我实际上已经在使用 wget 设置 cron,但是现在运行它时,由于它非常密集,所以整个站点都陷入了困境。
      【解决方案3】:

      您可能需要考虑将这个复杂的任务变成 rake 任务。您的 rake 任务仍然可以引用您的模型,因此建议您将尽可能多的相关逻辑推送到它们中。

      此外,由于您说任务受 CPU 限制并且在执行时会减慢站点速度,您可以使用 nice(假设您在 UNIX 系统上)来调整 rake 任务的优先级。

      【讨论】:

        【解决方案4】:

        我想说,在这种情况下,您的进程最好留在控制器领域之外。如果你有这么大的进程在运行时让整个系统陷入瘫痪,那么我的第一反应是假设我的进程没有它需要的那么流畅。如果该进程确实如此密集以至于它使整个系统陷入瘫痪,那么它是夜间进程或停机期间的主要候选者。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-06-17
          • 2014-11-06
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多