0

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

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

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

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

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

4

1 回答 1

0

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

默认情况下,所有作业的调度优先级 = 0,这是最高优先级。您可以通过将 Delayed::Worker.default_priority 设置为其他值来更改此设置。较低的数字具有较高的优先级。

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

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

于 2012-07-05T19:55:25.063 回答