首页 > 解决方案 > Django:芹菜为同一任务显示不同的状态

问题描述

我有一个 django 应用程序,有两个芹菜任务,比如 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 发送到前端。

标签: djangocelerydjango-celerycelery-task

解决方案


推荐阅读