с использованием методов класса в качестве задач сельдерея

Я пытаюсь использовать методы класса в качестве задач django-celery, помечая их с помощью декоратора @task. Та же самая ситуация описана здесь , на вопрос Ананда Джейахара. Это примерно так

class A:
    @task
    def foo(self, bar):
        ...

def main():
    a = A()
    ...
    # what i need
    a.foo.delay(bar) # executes as celery task 
    a.foo(bar) # executes locally

Проблема в том, что даже если я использую такой экземпляр класса a.foo.delay (bar) , он говорит, что foo требует как минимум двух аргументов, которые означает, что указатель self не работает.

Дополнительная информация:

  • Я не могу преобразовать класс в модуль из-за наследования
  • Методы сильно зависят от членов класса, поэтому я не могу сделать их статическими
  • Пометка класса как задачи с помощью декоратора @task делает класс самой задачей, и можно было бы выполнять методы из метода run () , используя некоторый аргумент в качестве ключа для выбора метода, но это не совсем то, что мне нужно.
  • Создание экземпляра класса и передача его в качестве аргумента self методам меняет способ выполнения методов не как сельдерея, а как обычные методы (т. Е. Во время тестирования)
  • Я пытался выяснить, как я могу зарегистрировать задачу динамически, например, из конструктора, но сельдерей разделяет код между рабочими, поэтому это кажется невозможным.

Спасибо за вашу помощь!

42
задан Community 23 May 2017 в 10:31
поделиться