8

在项目中,我尝试轮询一个长时间运行的任务的 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) 时,它显示正确的工人状态。

4

3 回答 3

9

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

正确的:

task_track_started = True

也正确:

CELERY_TASK_TRACK_STARTED = True

错误的!:

CELERY_TRACK_STARTED = True

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

于 2018-03-12T16:36:20.807 回答
3

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

CELERY_TRACK_STARTED

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

也许您CELERY_TRACK_STARTED = True在开发环境中有,但在生产环境中没有?

于 2014-07-02T16:43:14.917 回答
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文档:

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

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

于 2020-01-03T14:54:47.777 回答