Celery current_task.update_state не работает

Я пытаюсь добавить долго выполняющуюся асинхронную задачу и заставить ее обновлять статус выполнения через определенные промежутки времени. Я использую сервер Django-rest-framework, брокер RabbitMQ, рабочий Celery. Мне удается добавить задачу в Celery и даже успешно получить результат по завершении задачи.

Всякий раз, когда я пытаюсь получить состояние до завершения задачи, я получаю следующее:

task.result = None, task.state = PENDING, task.info = None

При попытке получить состояние после завершения:

task.result = None, task.state = PENDING, task.info = None

DeployML/
    manage.py
    DeployML/
        ...
        settings.py
        tasks.py
        dcelery.py
        views.py
        urls.py

dcelery.py:

import os

from celery import Celery

import sys
sys.path.append('.....DeployML')
sys.path.append('.....DeployML/DeployML')
# Set the default Django settings module for the 'celery' program.
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'DeployML.settings')

app = Celery('DeployML', backend='rpc://', broker='pyamqp://guest@localhost//', worker_state_db = '/tmp/celery_state')
app.config_from_object('django.conf:settings')
app.autodiscover_tasks()

@app.task(bind=True)
def debug_task(self):
    print(f'Request: {self.request!r}')

tasks.py:

import os
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'DeployML.settings')
from celery import shared_task
from celery import current_task
from dcelery import app
import time

@app.task(bind=True)
def addShrd(self, x, y):
    for i in range(4):
        time.sleep(5)
        progress_percent = i
        #NOTE update_state not working yet
        current_task.update_state(state='PROGRESS', meta={'current': i, 'total': 4})
    return x + y

views.py:

#...
#...
@api_view(['GET', 'POST'])
def celer_view(request):
    print("authentication: ", request.user, request.auth)
    if request.method == 'GET':
        result = addShrd.delay(17,10)
        return Response({'task_id': str(result.id)})    
    elif request.method == 'POST':
        return Response({'some': 'POST response data'})    
    return Response({'some': 'data'})

import dcelery
@api_view(['GET', 'POST'])
def poll_state(request):
    data = 'Fail'
    print("requ: "+str(request.POST.get('task_id')))
    if 'task_id' in request.POST.keys() and request.POST['task_id']:
        task_id = request.POST['task_id']
        task = dcelery.AsyncResult(task_id)
        print("meta data: "+ str(task.info))
        data = str(task.result) + " " +str(task.state) + " | " + str(task.info)
    else:
        data = 'No task_id in the request'
    return Response({'some': 'poll_state data: '+data})

checkout Asyncresult.

также проверьте использование здесь: celery.result.AsyncResult usages

Вернуться на верх