Django芹菜工作流链暂停/恢复

时间:2013-02-15 01:49:14

标签: celery django-celery

有没有办法暂停/恢复使用celery 3.0链创建的正在运行的工作流程?

基本上,我们的系统中有两种不同类型的任务:交互式和非交互式任务。非交互式的,我们有所有参数,但交互式的需要用户输入。请注意,对于交互式任务,我们只能在链中的所有先前的tak完成后询问用户输入,因为它们的结果将影响交互式任务(即,在创建实际链之前我们不能要求用户输入)。 / p>

有关如何处理此事的任何建议?真的不知所措..

目前的想法:

  • 创建两个Task的子类(来自celery import Task)。将一个额外的实例(类成员)变量添加到Interactive任务子类,默认情况下设置为false,表示仍然需要一些用户输入。以某种方式可以访问Task的实例,并从芹菜工作者的外部设置为true(虽然我已经看了很多,但似乎无法直接从另一个模块访问Task对象)
  • 将链分区为由Interactive作业分隔的多个链。一旦链条到达终点并且触发交互式任务的交互式客户端组件,就会在芹菜工作者之外检测某种机制。用户输入所有这些数据后,获取数据,然后启动新链,其中交互式任务位于新链的首位。

1 个答案:

答案 0 :(得分: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