2012-07-05 26 views
0

我有一個很大的任務需要幾個主要步驟:步驟A必須在步驟B可以開始之前完成,等等。但是,在我的情況下,每個主要步驟可以分成多個進程,使用Delayed::Job如何執行Process#waitall的Delayed :: Job等價物?

問題:是否有一種簡單的方法只有在所有過程都完成了步驟A後才能啓動步驟B?

注意1:我不知道先驗有多少外部員工已經分手了,所以保留一個完成的工人的參考計數將無濟於事。注意2:我不想創建一個工作人員,他的唯一工作就是忙於等待其他工作完成。 Heroku工人花錢!注意3:我考慮讓每個工作人員檢查after回調中的Delayed :: Job隊列,以確定它是否是最後一個在步驟A上工作的人,在這種情況下,它可以啓動步驟B.這可以起作用,但似乎充滿了陷阱。 (在沒有更好的答案的情況下,這是我正在使用的方法。)

回答

0

我認爲這取決於您正在做什麼的具體情況,但您可以設置優先級,以便從步驟A先跑步。根據具體情況,這可能就足夠了。從github page

默認情況下,所有的作業計劃優先= 0,這是最高優先 。你可以通過設置 Delayed :: Worker.default_priority來改變它。較低的號碼具有較高的優先級 。

因此,如果您將步驟A設置爲以優先級= 0運行,並且步驟B以優先級= 100運行,則步驟B中的任何操作都不會運行,直到步驟A完成。

在某些情況下,這會造成問題 - 特別是,如果您有大量工作並且運行了大量工作人員,那麼您可能會有一些工作人員在步驟A完成之前運行步驟B.理想情況下,在這個設置中,步驟B有一些檢查來檢查它是否可以運行。

+0

我試過這種方法 - 即使有優先級,如果一個或多個步驟A任務失敗並正在等待重試,則步驟B任務將啓動。正如您所指出的,步驟B中的任務需要檢查步驟A是否已經完成。 – 2012-07-05 21:11:43