use*_*121 6 python django celery celery-task django-celery
在项目中,我尝试轮询一个长时间运行的任务的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')
Run Code Online (Sandbox Code Playgroud)
在另一个注释中,花总是显示工人的状态离线,但任务状态是正确的.使用芹菜事件3.1.12(Cipater)时,它显示正确的工作人员状态.
对于 Celery 4.1.0 和 Django 1.11.7,这是你在 config.py 文件中需要的:
正确的:
task_track_started = True
Run Code Online (Sandbox Code Playgroud)
也正确:
CELERY_TASK_TRACK_STARTED = True
Run Code Online (Sandbox Code Playgroud)
错误的!:
CELERY_TRACK_STARTED = True
Run Code Online (Sandbox Code Playgroud)
我花了2个小时才弄清楚。希望这在不久的将来为某人服务
这可能与CELERY_TRACK_STARTED设置有关。引用文档:
\n\n\n\n\nCELERY_TRACK_STARTED
\n\n如果为 True,则当工作人员执行任务时,任务将报告其状态为\n \xe2\x80\x9cstarted\xe2\x80\x9d。默认值为 False,因为正常行为是不报告该粒度级别。任务正在挂起、已完成或等待重试。当存在长时间运行的任务并且需要报告当前正在运行的任务时,\xe2\x80\x9cstarted\xe2\x80\x9d 状态非常有用。
\n
也许你有CELERY_TRACK_STARTED = True在开发设置中有,但在生产中没有?