AsyncResult(task_id)返回" PENDING"即使在任务开始后也要说明

时间:2014-07-01 19:40:49

标签: python django celery django-celery celery-task

在项目中,我尝试轮询长期运行任务的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')

另一方面,花卉总是显示工人的状态离线,但任务状态是正确的。使用芹菜事件3.1.12(Cipater)时,它显示正确的工作人员状态。

3 个答案:

答案 0 :(得分:2)

它可能与CELERY_TRACK_STARTED设置有关。引用文档:

  

CELERY_TRACK_STARTED

     

如果为True,任务将报告其状态为   当工作人员执行任务时,“已启动”。默认值为   假的正常行为是不报告该级别   粒度。任务处于待处理状态,已完成状态或等待处理状态   重试。具有“已启动”状态对于存在时可能是有用的   长时间运行的任务,需要报告哪个任务   目前正在运行。

也许您的开发设置中有CELERY_TRACK_STARTED = True,但生产中没有?

答案 1 :(得分:1)

对于Celery 4.1.0和Django 1.11.7,这是config.py文件中所需的:

正确:

task_track_started = True

同样正确:

CELERY_TASK_TRACK_STARTED = True

错误!:

CELERY_TRACK_STARTED = True

我花了2个小时才弄明白。希望这能在不久的将来为某人服务

答案 2 :(得分:0)

对于使用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文档:

结果将是芹菜AsyncResult对象的列表,您可以 忽略,或用于检查电子邮件传递任务的状态,甚至 如果需要,等待它完成。您必须启用结果后端 并根据需要在CELERY_EMAIL_TASK_CONFIG中将ignore_result设置为False 使用这些。您还应该在以下位置设置CELERY_EMAIL_CHUNK_SIZE = 1 设置,如果您担心任务状态和结果。

希望这对其他人有帮助,同样也花费了几个小时来解决这个问题...