Django 后台任务等待结果

Django background tasks wait for result

由于 heroku 的 30 秒超时,我正在尝试 运行 在后台执行一些机器学习计算任务。我正在尝试实施 django-background-tasks。这是我的代码:

def process_data(request):
    symbol = request.GET.get('symbol')
    data = test1.now(symbol)
    print(data)
return JsonResponse(data, safe=False)


@background(schedule=0)
    def test1(symbol):
    symbol = symbol+'ksksk'
    #long running machine learning stuff
    return symbol

我在等待计算完成时显示加载屏幕,然后 return 使用 jsonresponse 显示数据。但是当我打印它显示的数据类型而不是我需要的数据时:

<class 'background_task.models.Task'>

如何将我在后台计算的数据获取到原始视图,以便我可以显示输出?

后台任务通常是异步的,这意味着进程将 运行 在后台运行。在我看来,期望您的请求立即得到结果没有任何意义。接收例如更有意义。 201 已创建,通知用户请求已收到,将进行处理。

当应用程序处理它时,它可以将结果写入数据库并通过 API 或接口公开结果。

app.com/run-computation?symbol=something # 201 Created

# (API)view
def run_computation(request):
    symbol = request.GET.get('symbol')
    data = compute.now(symbol)

    return JsonResponse({"201"}, safe=True)

# Task
@background(schedule=0)
def compute(symbol):
    # Do a lot of exciting stuff
    result = this_will_take_a_while(symbol)

    # Write result to database so it can be exposed
    ComputeResult.objects.create(symbol=symbol, result=result)

    # Most likely this task will not return anything, since the result
    # is stored when completed and exposed elsewhere. When it fails
    # it is stored in the Task object:
    # @see: https://github.com/arteria/django-background-tasks/blob/master/background_task/models.py#L206

当计算完成并且结果可用时,可以公开它:

# (API)view
def get_results():
   results = ComputeResult.objects.all()
   return JsonResponse(serialize_results(results))

app.com/results/
[{
    "symbol": "something",
    "result": [...]
},
{
    "symbol": "interesting",
    "result": [...]
}]

您当前返回的对象是一个内部对象,包含django-background-tasks如何处理异步任务的信息。