Возвращение идентификатора задачи 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