django 正在将Celepie任务ID返回到视图

mgdq6dx1  于 2022-12-20  发布在  Go
关注(0)|答案(1)|浏览(139)

在我的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"}

问题是celery 输出以下错误:

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'

我知道这个错误,但我不知道如何继续。

omvjsjqw

omvjsjqw1#

如果你想计算一个数组的中值来解决这个问题,你需要从你的任务函数中删除对.id的调用,并且你可以直接返回numpy.mean的结果,而不是返回任务结果的id

@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

相关问题