2013-02-15 167 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