Python Celery: обновление состояния AsyncResult

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

Однако: 1/ я не могу найти способ получить фактический экземпляр задачи на основе его идентификатора, только его AsyncResult

def level5_success(task_id):
  result = app.AsyncResult(task_id)
  # Set the parent task state (do not work)
  app.AsyncResult(task_id).update_state(state='HOWAREYOUDOING') 

2/Я не могу найти способ обновить состояние AsyncResult, только с самой задачей, использующей update_state:

def on_level4_success(sender, *args, **kwargs):
  sender.update_state(state='HOWAREYOUDOING')

Есть идеи?


person Antoine Brunel    schedule 25.06.2015    source источник


Ответы (1)


Такое ощущение, что вы работаете за пределами того, для чего предназначен сельдерей. Предполагается, что координация рабочего состояния и процесса осуществляется с помощью рабочего холста. , а не возиться с внутренностями сельдерея. Даже если вам удастся заставить его работать, я сомневаюсь, что взлом состояния входит в контракт, который сельдерей намеревается сохранить со своим API; вполне возможно, что ваша работа будет нарушена будущими изменениями в celery.

Что вы пытаетесь сделать, чего не можете сделать с группами, аккордами и цепочками?

person bwarren2    schedule 25.06.2015
comment
Ну, может быть, это проблема дизайна. У меня разные уровни задач запускаются асинхронно. Самый низкий уровень выполняет один вызов API для Twitter API. В случае успеха, в зависимости от оставшихся доступных вызовов (из-за ограничений API Twitter), я либо немедленно отправляю другую подзадачу, либо жду 15 минут (время для повышения ограничений API), либо все было извлечено, поэтому задание завершено. Но использование сигналов on_success не позволяет мне использовать цепочки. Это моя проблема. - person Antoine Brunel; 25.06.2015
comment
Это похоже на динамическое изменение расписания с такими вещами, как обратный отсчет подойдет для вашего варианта использования. В частности, вы нажимаете API-интерфейс Twitter и получаете вариант if, который либо немедленно переназначает задачу, переназначает с обратным отсчетом, либо делает любую очистку, которая вам нужна. Если вам нужно обмениваться данными между задачами, вы можете передать объект конфигурации. - person bwarren2; 25.06.2015