Django Celery工作流链暂停/恢复



是否有任何方法可以暂停/恢复使用来自celeb3.0的链创建的运行工作流?

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

关于如何处理这个问题,有什么建议吗?真的不知所措。。

当前想法:

  • 创建Task的两个子类(来自芹菜导入Task)。向Interactive任务子类添加一个额外的实例(类成员)变量,该变量默认设置为false,表示仍需要一些用户输入。不知何故,可以访问Task的实例,并从芹菜工作者外部将其设置为true(尽管我已经查找了很多,似乎不可能直接从另一个模块访问Task对象)
  • 将链划分为多个由Interactive作业分隔的链。让芹菜工作者之外的某种机制在链到达末端后进行检测,并触发交互式任务的交互式客户端组件。一旦用户输入了所有这些数据,获取数据,并启动新链,其中交互任务位于新链的顶端

我们已经在我们的项目中实现了类似于您的第二个想法&它运行良好。以下是实现的要点。

将新字段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)

任务.py

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

函数.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

最新更新