Вам нужно вызвать .get()
для объекта AsyncTask, который вы создаете, чтобы фактически получить результат из внутреннего интерфейса.
См. Celery FAQ .
Чтобы уточнить мой ответ.
Любая строка технически является допустимым идентификатором, нет способа проверить идентификатор задачи.Единственный способ выяснить, существует ли задача, это спросить у бэкэнда, знает ли она об этом, и для этого необходимо использовать .get()
.
. Это создает проблему, которую .get()
блокирует, когда бэкэнд не работает.У вас нет никакой информации об указанном вами идентификаторе задачи, это сделано для того, чтобы вы могли запустить задачу и затем дождаться ее завершения.
В случае исходного вопроса я предполагаю, чтоОП хочет получить состояние ранее выполненной задачи.Для этого вы можете передать очень маленький тайм-аут и перехватить ошибки тайм-аута:
from celery.exceptions import TimeoutError
try:
# fetch the result from the backend
# your backend must be fast enough to return
# results within 100ms (0.1 seconds)
result = AsyncResult('blubb').get(timeout=0.1)
except TimeoutError:
result = None
if result:
print "Result exists; state=%s" % (result.state,)
else:
print "Result does not exist"
Само собой разумеется, что это работает, только если ваш бэкэнд хранит результаты, если нет, то нет способа узнать, является лиИдентификатор задачи действителен или нет, потому что ничего не хранит их запись.
Еще больше разъяснений.
То, что вы хотите сделать, не может быть выполнено с помощью бэкэнда AMQP, потому что он не сохраняет результаты, он пересылает их .
Я бы предложил переключиться на серверную часть базы данных, чтобы результаты находились в базе данных, которую можно запрашивать за пределами существующих модулей сельдерея.Если в базе данных результатов нет задач, можно предположить, что идентификатор недействителен.