在我的模型中,我有一个status
字段,默认值为'Processing'。在Django管理界面中,用户单击“保存”按钮后,表单输入将传递给芹菜任务,该任务只需休眠30秒。
在30秒之后,我该怎么做:
status
字段从“处理”更新为实际状态(例如:已完成,失败?models.py
from django.db import models
class Scorecard(models.Model):
name = models.CharField(max_length=100, unique=True)
status = models.CharField(max_length=20, default='Processing')
def __str__(self):
return self.name
admin.py
from django.contrib import admin
from scorecards.models import Scorecard
from scorecards.tasks import get_report
class ScorecardAdmin(admin.ModelAdmin):
list_display = ['name', 'status']
def save_model(self, request, obj, form, change):
if form.is_valid():
data = form.cleaned_data
name = data['name']
get_report.delay(name)
super().save_model(request, obj, form, change)
admin.site.register(Scorecard, ScorecardAdmin)
tasks.py
from __future__ import absolute_import, unicode_literals
from celery import shared_task
from time import sleep
@shared_task
def get_report(name):
sleep(30)
每隔x个时间间隔更新status
字段的芹菜任务的实时状态会很好,但是现在我真的很好奇如何做到这一点。
答案 0 :(得分:1)
我还没有弄清楚实时状态(但是)但是一旦任务完成,它就会设法改变状态。
以下是主要部分。了解其原因的关键原因是我在--pool=solo
开始了这样的芹菜工作者:
celery -A scorecard worker --pool=solo -l info
这是一个单线程执行池(对我目前的用途来说很好),但这意味着它将处理第一个任务get_report(name)
,完成后,处理{{1}它检查结果的状态,并将状态字段设置为实际状态。
models.py
set_task_status(id)
admin.py
class Scorecard(models.Model):
....
task_id = models.CharField(max_length=50)
tasks.py
class ScorecardAdmin(admin.ModelAdmin):
...
result = get_report.delay(name)
set_task_status.delay(result.task_id)
...
这是我到目前为止所知道的。