2013-02-15 99 views
6

有什麼方法可以暫停/恢復使用芹菜3.0鏈創建的正在運行的工作流嗎?Django芹菜工作流暫停/恢復

基本上,我們的系統中有兩種不同類型的任務:交互式和非交互式。非交互式的我們有所有的參數,但交互式的需要用戶輸入。請注意,對於交互式任務,一旦鏈中所有先前的完成都已完成,我們只能請求用戶輸入,因爲它們的結果將影響交互式任務(即,在創建實際鏈之前我們無法要求用戶輸入)。

任何有關如何解決這個問題的建議?真叫這裏..

當前的想法:

  • 創建任務的兩個子類(芹菜進口任務)。向Interactive Task子類添加一個額外的實例(類成員)變量,默認情況下該變量設置爲false,並表示仍需要某些用戶輸入。以某種方式可以訪問Task的實例,並從芹菜工作者的外部將其設置爲true(儘管我已經查看了相當多的東西,似乎無法直接從另一個模塊訪問Task對象)
  • 將鏈分割成由交互作業分隔的多個鏈。一旦鏈條到達終點並在觸發交互式任務的交互式客戶端組件時,在芹菜工作者之外有某種機制進行檢測。一旦用戶輸入了所有這些數據,就可以獲取數據,並開始交互式任務位於新鏈的開頭的新鏈。

回答

2

我們已經在我們的項目&中實施了類似您的第二個想法,它工作正常。這是實施的要點。

將新字段status添加到您的模型&重寫保存方法。

models.py:

class My_Model(models.Model): 
    # some fields 
    status = models.IntegerField(default=0) 

    def save(self, *args, **kwargs): 
     super(My_Model, self).save(*args, **kwargs) 
     from .functions import custom_func 
     custom_func(self.status) 

tasks.py

@celery.task() 
def non_interactive_task(): 
    #do something. 

@celery.task() 
def interactive_task(): 
    #do something. 

functions.py

def custom_func(status): 
    #Change status after non interactive task is completed. 
    #Based on status, start interactive task. 

status變量可用於顯示用戶輸入信息的UI元素的模板。當用戶輸入所需信息時,請更改狀態。這將調用custom_func,這會觸發interactive_task