在项目中,我尝试轮询一个长时间运行的任务的 task.state 并更新其运行状态。它在开发中工作,但是当我将项目移动到生产服务器上时它不会工作。即使我可以看到任务从花开始,我也一直在“等待”。但是,当 task.state == 'SUCCESS' 时,我仍然可以在任务完成时更新结果。我在生产中使用 python 2.6、Django 1.6 和 Celery 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')
另一方面,花总是离线显示工人的状态,但任务状态是正确的。使用 celery events 3.1.12 (Cipter) 时,它显示正确的工人状态。