Сельдерей AsyncResult всегда ОЖИДАЕТ

Я работаю над демо, и код прост:

# The Config
class Config:
    BROKER_URL = 'redis://127.0.0.1:6379/0'
    CELERY_RESULT_BACKEND = 'redis://127.0.0.1:6379/0'
    CELERY_ACCEPT_CONTENT = ['application/json']

# The Task
@celery_app.task()
def add(x, y):
    return x + y

Чтобы запустить рабочего:

$ celery -A appl.task.celery_app worker --loglevel=info -broker=redis://localhost:6379/0

 -------------- [email protected] v3.1.13 (Cipater)
 ---- **** ----- 
 --- * ***  * -- Linux-3.2.0-4-amd64-x86_64-with-debian-7.6
 -- * - **** --- 
 - ** ---------- [config]
 - ** ---------- .> app:         celery_test:0x293ffd0
 - ** ---------- .> transport:   redis://localhost:6379/0
 - ** ---------- .> results:     disabled
 - *** --- * --- .> concurrency: 2 (prefork)
 -- ******* ---- 
 --- ***** ----- [queues]
 -------------- .> celery           exchange=celery(direct) key=celery

Запланировать задачу:

>>> from appl.task import add
>>> r = add.delay(1, 2)
>>> r.id
'c41d4e22-ccea-408f-b48f-52e3ddd6bd66'
>>> r.task_id
'c41d4e22-ccea-408f-b48f-52e3ddd6bd66'
>>> r.status
'PENDING'
>>> r.backend
<celery.backends.redis.RedisBackend object at 0x1f35b10>

Затем рабочий выполнит задачу:

[2014-07-29 17:54:37,356: INFO/MainProcess] Received task: appl.task.add[beeef023-c582-42e1-baf7-9e19d9de32a0]
[2014-07-29 17:54:37,358: INFO/MainProcess] Task appl.task.add[beeef023-c582-42e1-baf7-9e19d9de32a0] succeeded in 0.00108124599865s: 3 

Но результат остается PENDING:

>>> res = add.AsyncResult(r.id)
>>> res.status
'PENDING'

Я пробовал официальный FAQ. Но это не помогло.

>>> celery_app.conf['CELERY_IGNORE_RESULT']
False

Что я сделал неправильно? Спасибо!

Ответы

Ответ 1

Это было некоторое время, но я оставляю это больше для других, которые приходят вместе с аналогичной проблемой:

На снимке экрана вы увидите, что результаты отключены.

введите описание изображения здесь

Когда вы создаете экземпляр экземпляра celery, убедитесь, что у вас есть правильные входы конфигурации

from celery import Celery,Task

# here im using an AMQP broker with a memcached backend to store the results
celery = Celery('task1',broker='amqp://guest:[email protected]:5672//',backend='cache+memcached://127.0.0.1:11211/')

По какой-то причине мне всегда не удается получить экземпляр celery, параметризованный через файл конфигурации и, следовательно, явно переданный в брокере и бэкэнд во время создания экземпляра, как показано выше.

Теперь вы увидите, что результаты, правильно настроенные для memcached (в моем случае - должны быть redis в вашем). Также убедитесь, что ваша задача выбрана в списке задач (task1.add)

введите описание изображения здесь

Если вы все еще не можете заставить его работать, при запуске сельдерея попробуйте использовать опцию debug, как показано ниже

celery worker -A task1.celery -l debug

посмотреть, что-то не так в информации, которую он извергает

В моем случае он исправил вашу ошибку, и результат был достигнут успеха, и я смог восстановить 3 на r.get()

Ответ 2

Это работает для меня:

from celery.result import AsyncResult
celery_task_result = AsyncResult(task_id)
task_state = celery_task_result.state

и task_state получают все виды статуса: 'FAILURE', 'SUCCESS', 'PENDING' и т.д.

Ответ 3

  • Попробуйте изменить своего брокера на что-то еще (например, rabbitmq) и снова проверьте статус.

  • Убедитесь, что ваш сервер redis установлен и доступен для сельдерея. redis-cli keys * и вы должны увидеть некоторые ключи, связанные с сельдереем, если это не означает, что в вашем брокере есть проблема.