即使在任务开始后,AsyncResult(task_id)也会返回"PENDING"状态

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)时,它显示正确的工作人员状态.

rad*_*ia2 9

对于 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个小时才弄清楚。希望这在不久的将来为某人服务


Séb*_*rez 3

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

\n\n
\n

CELERY_TRACK_STARTED

\n\n

如果为 True,则当工作人员执行任务时,任务将报告其状态为\n \xe2\x80\x9cstarted\xe2\x80\x9d。默认值为 False,因为正常行为是不报告该粒度级别。任务正在挂起、已完成或等待重试。当存在长时间运行的任务并且需要报告当前正在运行的任务时,\xe2\x80\x9cstarted\xe2\x80\x9d 状态非常有用。

\n
\n\n

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

\n

  • 我的 settings.py 中有 'CELERY_TRACK_STARTED = True' ,并使用 os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'mysite.settings') 设置 celeryconfig.py 。问题是 AsyncResult(task_id).state 始终返回“PENDING”状态,因此任务启动时我的模板无法更新为“STARTED”。但花和芹菜事件监视器都显示任务已正确启动。很困惑。 (3认同)