如何解决Django后台任务等待结果
由于 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
我在等待计算完成时显示加载屏幕,然后使用 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 如何处理异步任务的信息。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。