Django:芹菜显示同一任务的不同状态

问题描述

我有一个 django 应用程序,有两个 celery 任务,比如 task1 和 task2。 task1 在来自前端的 POST 请求上被触发,并且该请求必须发回任务 ID,以便前端可以稍后轮询其状态。 task2 应该在 task1 成功后异步运行。

这是我的任务定义:

@shared_task(ignore_result=False)
def task1(pk: int):
    # retrieve object matching pk
    return task1_func(obj)


@shared_task(ignore_result=False)
def task2(task_id: int):
    task = AsyncResult(task_id)
    while not task.ready():
       logger.info("status {}".format(task.status))
        time.sleep(1)
    return task2_func()

这是我在 views.py 中触发它们的方式:

class MyView(viewsets.ModelViewSet):
    def create(self,request):
        # create object

        task = task1.delay(obj.pk)
        task2.delay(task.id)
        #breakpoint
        return Response(task.id,status=status.HTTP_200_OK)

现在当我尝试在断点处检查状态时,它显示成功:

In [1]: task.id                                                                         
Out[1]: '97f8d150-de04-4848-a400-3882988c833c'                                          

In [2]: task.status                                                                     
Out[2]: 'SUCCESS'                                                                       

In [3]: AsyncResult(task.id).status                                                     
Out[3]: 'SUCCESS' 

但是 task2 中的代码永远不会被执行,因为 task2 中 task1 的状态永远不会从 PENDING 改变。我究竟做错了什么?显然,我的结果正在被存储和访问,但由于某种原因,我无法从另一个任务中看到状态的变化。 我无法链接任务,因为我必须将第一个任务的 ID 发送到前端。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...