如何处理Delay#:: Job等效的Process#waitall?

时间:2012-07-05 17:38:02

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

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

问题:只有在所有流程完成步骤A后才能启动步骤B的简单技术吗?

注1:我不知道先验有多少外部工人被调动,因此保留已完成工人的参考数量无济于事。

注2:我宁愿不创造一个工人,他的唯一工作就是忙于等待其他工作完成。 Heroku工人花钱!

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

1 个答案:

答案 0 :(得分:0)

我认为这实际上取决于你正在做什么的具体细节,但是你可以设置优先级,使得步骤A中的任何作业都先运行。根据具体情况,这可能就足够了。来自github page

  

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

因此,如果您将步骤A设置为优先级= 0,步骤B优先级= 100,则步骤B中的任何内容都将运行,直到步骤A完成。

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