【问题标题】:How do I do the Delayed::Job equivalent of Process#waitall?我如何执行 Process#waitall 的 Delayed::Job 等效项?
【发布时间】:2012-07-06 03:55:25
【问题描述】:

我有一个大任务,分几个主要步骤进行:步骤 A 必须在开始步骤 B 之前完成,等等。但每个主要步骤都可以分成多个进程,在我的例子中,使用 Delayed::Job

问题:有没有一种简单的技术可以在所有流程都完成步骤 A 之后才开始步骤 B?

注意 1:我不知道 先验 有多少外部工作人员已启动,因此保持已完成工作人员的引用计数无济于事。

注意 2:我不希望创建一个工作人员,其唯一工作是忙于等待其他工作完成。 Heroku 工人要花钱!

注意 3:我考虑让每个工作人员检查 after 回调中的 Delayed::Job 队列,以确定它是否是在步骤 A 上工作的最后一个,在这种情况下,它可以启动步骤 B。这可能有效,但似乎可能充满了陷阱。 (在没有更好的答案的情况下,这是我要采用的方法。)

【问题讨论】:

    标签: ruby-on-rails-3 delayed-job


    【解决方案1】:

    我认为这实际上取决于您正在执行的操作的具体情况,但您可以设置优先级,使步骤 A 中的任何作业首先运行。根据具体情况,这可能就足够了。来自github page

    默认情况下,所有作业的调度优先级 = 0,即最高 优先。您可以通过设置更改此设置 延迟::Worker.default_priority 到别的东西。较低的数字有 更高的优先级。

    因此,如果您将步骤 A 设置为以优先级 = 0 运行,而将步骤 B 设置为以优先级 = 100 运行,那么在步骤 A 完成之前,步骤 B 中的任何内容都不会运行。

    在某些情况下,这会出现问题 - 特别是,如果您有很多工作并且正在运行大量工作人员,那么在步骤 A 中的工作完成之前,您可能会有一些工作人员在运行步骤 B。理想情况下,在此设置中,步骤 B 会进行某种检查以检查它是否可以运行。

    【讨论】:

    • 我尝试了这种方法——即使有优先级,如果一个或多个步骤 A 任务失败并等待重试,步骤 B 任务将启动。正如您所指出的,步骤 B 中的任务需要检查步骤 A 是否已真正完成。
    猜你喜欢
    • 2013-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-11
    • 2011-10-02
    • 1970-01-01
    • 1970-01-01
    • 2014-03-23
    相关资源
    最近更新 更多