在项目中,我尝试轮询任务。长时间运行任务的状态,并更新其运行状态。它在开发中工作,但当我将项目移动到生产服务器上时就不起作用了。我一直得到"PENDING",即使我可以看到任务已经开始了。但是,当任务完成时,我仍然可以得到更新的结果。state == 'SUCCESS'。我在生产中使用python 2.6, Django 1.6和芹菜3.1,结果后端AMQP。
@csrf_exempt
def poll_state(request):
data = 'Fail'
if request.is_ajax():
if 'task_id' in request.POST.keys() and request.POST['task_id']:
task_id = request.POST['task_id']
email = request.POST['email']
task = AsyncResult(task_id)
print "task.state=", task.state
if task.state == 'STARTED':
task_state = 'Running'
data = 'Running'
#data = 'Running'
elif task.state == 'PENDING' or task.state == 'RETRY':
task_state = 'Waiting'
data = 'Pending'
elif task.state == 'SUCCESS':
task_state = 'Finished'
if task.result:
data = task.result
else:
data = 'None'
else:
task_state = task.state
data = 'Error'
print 'data status =', task_state
else:
task_state = task.state
data = 'Error'
else:
task_state = task.state
data = "Error"
json_data = json.dumps({'task_state':task_state, 'task_data':data})
return HttpResponse(json_data, mimetype='application/json')
另一个注意事项,花总是显示工人的状态离线,但任务状态是正确的。当使用芹菜事件3.1.12 (Cipater)时,它会显示正确的工作状态。
对于芹菜4.1.0和Django 1.11.7,这是你在config.py文件中需要的内容:
正确的:
task_track_started = True
亦正确:
CELERY_TASK_TRACK_STARTED = True
错了!:
CELERY_TRACK_STARTED = True
我花了2个小时才弄明白。希望这篇文章能在不久的将来对某些人有所帮助
这可能与CELERY_TRACK_STARTED设置有关。引用文档:
CELERY_TRACK_STARTED
如果为True,任务将报告其状态为当任务由worker执行时,"started"。默认值为假的正常行为是不报那一级的粒度。任务要么挂起,要么完成,要么等待完成重试。拥有一个"已启动"状态在需要的时候是很有用的长时间运行的任务,需要报告哪个任务是当前运行。
也许您在开发设置中有CELERY_TRACK_STARTED = True
,但在生产中没有?
对于使用django-celery-email
的人—有必要设置以下设置:
CELERY_EMAIL_TASK_CONFIG = {
'name': 'djcelery_email_send',
'ignore_result': False,
}
CELERY_TASK_TRACK_STARTED = True
CELERY_EMAIL_CHUNK_SIZE = 1
我相信我遇到的类似问题是由于将'ignore_result'
设置为True
。来自django-celery-email
文档:
results将是您可以使用的芹菜AsyncResult对象的列表忽略,或用于检查邮件发送任务的状态,甚至如果需要,等待它完成。您必须启用结果后端如果需要,可以将CELERY_EMAIL_TASK_CONFIG中的ignore_result设置为False用这些。您还应该设置CELERY_EMAIL_CHUNK_SIZE = 1 in
如果您关心任务状态和结果。
希望这对其他人有所帮助,同样也花了几个小时来解决这个问题…