Получить результат из задачи «task_id» в сельдерей из неизвестной задачи

Как я могу выполнить результат задачи, если не знаю, какая была ранее выполняемая задача? Вот настройка: Учитывая следующий источник («tasks.py»):

from celery import Celery app = Celery('tasks', backend="db+mysql://u:p@localhost/db", broker = 'amqp://guest:guest@localhost:5672//') @app.task def add(x,y): return x + y @app.task def mul(x,y): return x * y 

с RabbitMQ 3.3.2, работающим локально:

 marcs-mbp:sbin marcstreeter$ ./rabbitmq-server RabbitMQ 3.3.2. Copyright (C) 2007-2014 GoPivotal, Inc. ## ## Licensed under the MPL. See http://www.rabbitmq.com/ ## ## ########## Logs: /usr/local/var/log/rabbitmq/rabbit@localhost.log ###### ## /usr/local/var/log/rabbitmq/rabbit@localhost-sasl.log ########## Starting broker... completed with 10 plugins. 

с сельдереем 3.1.12, работающим локально:

  -------------- celery@Marcs-MacBook-Pro.local v3.1.12 (Cipater) ---- **** ----- --- * *** * -- Darwin-13.2.0-x86_64-i386-64bit -- * - **** --- - ** ---------- [config] - ** ---------- .> app: tasks:0x105dea3d0 - ** ---------- .> transport: amqp://guest:**@localhost:5672// - ** ---------- .> results: disabled - *** --- * --- .> concurrency: 8 (prefork) -- ******* ---- --- ***** ----- [queues] -------------- .> celery exchange=celery(direct) key=celery 

Затем я могу импортировать этот метод и получить результат с помощью «task_id»:

 from tasks import add, mul from celery.result import AsyncResult result = add.delay(2,2) task_id = result.task_id result.get() # 4 result = AsyncResult(id=task_id) result.get() # 4 result = add.AsyncResult(id=task_id) result.get() # 4 # and the same for the 'mul' task. Just imagine I put it here 

В следующем примере я разделил эти шаги между процессами. В одном процессе я получаю «task_id» следующим образом:

 from tasks import add result = add.delay(5,5) task_id = result.task_id 

И в другом процессе, если я использую тот же «task_id» (скопированный и вставленный в другой REPL или в другой HTTP-запрос) следующим образом:

 from celery.result import AsyncResult result = AsyncResult(id="copied_task_id", backend="db+mysql://u:p@localhost/db") result.get() # AttributeError: 'str' object has no attribute 'get_task_meta' result.state # AttributeError: 'str' object has no attribute 'get_task_meta' result.status # AttributeError: 'str' object has no attribute 'get_task_meta' 

И в другом процессе, если я это сделаю:

 from task import add # in this instance I know that an add task was performed result = add.AsyncResult(id="copied_task_id") result.status # "SUCCESSFUL" result.state # "SUCCESSFUL" result.get() # 10 

Я хотел бы получить результат, не зная перед тем, какая задача будет генерировать результат. В моей реальной среде я планирую вернуть этот task_id клиенту и позволить им запрашивать статус своей работы через HTTP-запрос.

One Solution collect form web for “Получить результат из задачи «task_id» в сельдерей из неизвестной задачи”

Хорошо, поэтому я давно искал решение, и теперь, когда я окончательно разместил это и просмотрел документацию, я нашел этот камень :

class celery.result.AsyncResult (id, backend = None, task_name = None, app = None, parent = None)

Состояние задачи запроса.

Параметры :

id – см. id .

backend – см. бэкэнд .

исключение TimeoutError

Ошибка при истечении времени ожидания.

AsyncResult.app = Нет

Поэтому вместо предоставления параметра backend я предоставил аргумент «app» вместо этого так:

 from celery.result import AsyncResult from task import app # Assuming add.delay(10,10) was called in another process # and that I'm using a 'task_id' I retrieved from that process result = AsyncResult(id='copied_task_id', app=app) result.state # 'SUCCESSFUL' result.get() # 20 

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

  • Сельдерей: автоматическое обнаружение не находит модуль задач в приложении
  • Python Celery против библиотеки Threading для запуска асинхронных запросов
  • Задачи сельдерея с eta удаляются из RabbitMQ
  • Создание отдельного подключения к базе данных для каждого работника сельдерея
  • Как получить django celery для записи в тестовую базу данных для моих функциональных тестов?
  • демона сельдерея - разрешено в файле журнала
  • Сельдерей прекращает выполнение цепочки
  • Сельдерей. Может ли сообщение в RabbitMQ потреблять два или более рабочих одновременно?
  • Django, RabbitMQ и Celery - почему Celery запускает старые версии моих задач после обновления кода Django в разработке?
  • Соответствующий подход для очереди сообщений / запланированных задач в Django
  • Задача Django Celery на Heroku заставляет использовать большую память
  • Python - лучший язык программирования в мире.