Возвращение идентификатора задачи celery в представление

В моей задаче celery я хочу вычислить медиану массива.

Мое мнение:

import myapp.tasks as tasks

def my_view(request): 
    data_arr = [[1,2], [3,4]]
    response = {
        'median': tasks.median.delay(data_arr).id
    }
    return HttpResponse(json.dumps(response))   

Вот файл задания:

from celery import shared_task
import numpy

@shared_task
def median(arr):
    return numpy.mean(arr)

Когда я вызываю представление, я могу получить следующий вывод:

{"median": "88edea52-c60a-42a8-ad8d-799a4c7117a6"}

Проблема в том, что сельдерей выдает следующую ошибку:

File "/Users/tolga/Desktop/projects/python/nadir/process/tasks.py", line 7, in median
return numpy.mean(arr).id
AttributeError: 'numpy.float64' object has no attribute 'id'

Я понимаю ошибку, но не могу понять, как действовать дальше.

если вы хотите вычислить медиану массива, чтобы решить эту проблему, вам нужно удалить вызов .id из вашей функции задачи и вместо того, чтобы возвращать id результат задачи, вы можете просто вернуть результат numpy.mean напрямую:

@shared_task
def median(arr):
    return numpy.mean(arr)

В результате выполнения задания будет возвращено медианное значение массива arr.

но если вы хотите вернуть результат задачи id как результат представления, вы можете использовать класс AsyncResult для получения результата задачи и возврата его в представлении:

from celery.result import AsyncResult

def my_view(request): 
    data_arr = [[1,2], [3,4]]
    task = tasks.median.delay(data_arr)
    response = {
        'median': AsyncResult(task.id).result
    }
    return HttpResponse(json.dumps(response))

это извлечет результат задачи и включит его в объект ответа, а не в объект задачи id

Вернуться на верх