#django #celery #django-celery #celery-task
#django #сельдерей #django-сельдерей #сельдерей-задача
Вопрос:
У меня есть приложение django с двумя задачами сельдерея, скажем, task1 и task2. task1 запускается при запросе POST от интерфейса, и запрос должен отправить обратно идентификатор задачи, чтобы интерфейс мог опросить его статус позже. предполагается, что задача 2 будет выполняться после успешного завершения задачи 1 асинхронно.
Вот мои определения задач:
@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 никогда не выполняется, потому что статус task1 внутри task2 никогда не меняется PENDING
. Что я делаю не так? Очевидно, что мои результаты сохраняются и доступны, но по какой-то причине я не могу видеть изменение статуса внутри другой задачи.
Я не могу объединить задачи в цепочку, потому что я должен отправить идентификатор первой задачи во внешний интерфейс.