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

Ant*_*n K 6 celery django-celery

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

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

关于如何处理此问题的任何建议?真的在这里亏本..

目前的想法:

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

Chi*_*and 2

我们已经在我们的项目中实现了类似于您的第二个想法的东西,并且效果很好。这是实施的要点。

将新字段添加status到您的模型并覆盖保存方法。

模型.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)
Run Code Online (Sandbox Code Playgroud)

任务.py

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

@celery.task()
def interactive_task():
    #do something.
Run Code Online (Sandbox Code Playgroud)

函数.py

def custom_func(status):
    #Change status after non interactive task is completed.
    #Based on status, start interactive task.
Run Code Online (Sandbox Code Playgroud)

status变量传递给模板,这对于显示 UI 元素以供用户输入信息非常有用。当用户输入所需信息时,更改状态。这将触发custom_func您的调用interactive_task