Подтвердить что ты не робот

Django-celery: динамически создавать и регистрировать задачу

Я хотел бы добавить задержку произвольных задач с помощью django-celery. В настоящее время я создал класс, подобный приведенному ниже (просто пример, у фактических классов больше этого):

from celery.task import task

class Delayer(object):
    def delay(self, func, minutes):
        return task(func, name="%s.delayed"%self.__class__.__name__)\
            .apply_async(countdown=minutes*60)

Я запускаю celeryd следующим образом:

python manage.py celeryd -E -B -lDEBUG

Когда я пытаюсь запустить метод задержки из оболочки django [eg Delayer().delay(lambda: 1, 1)], я получаю ошибку, подобную этой в моем выходе celeryd:

[2013-01-02 15:26:39,324: ERROR/MainProcess] Received unregistered task of type "Delayer.delayed".
The message has been ignored and discarded.

Did you remember to import the module containing this task?
Or maybe you are using relative imports?
Please see http://bit.ly/gLye1c for more information.

The full contents of the message body was:
{'retries': 0, 'task': "Delayer.delayed", 'eta': '2013-01-02T21:27:39.320913', 'args': [], 'expires': None, 'callbacks': None, 'errbacks': None, 'kwargs': {}, 'id': '99d49fa7-bd4b-40b0-80dc-57309a6f19b1', 'utc': True} (229b)

Traceback (most recent call last):
  File "/home/simon/websites/envs/delayer/local/lib/python2.7/site-packages/celery/worker/consumer.py", line 432, in on_task_received
    strategies[name](message, body, message.ack_log_error)
KeyError: "Delayer.delayed"

Мой вопрос: возможно ли зарегистрировать такие динамически созданные задачи? Если нет, то какой другой метод я могу использовать для достижения такого же эффекта с использованием сельдерея?

4b9b3361

Ответ 1

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

Однако это предполагает возможный способ атаковать вещи: если вы можете придумать другой способ сериализации вашего вызываемого, тогда вы можете предоставить его в качестве аргумента для простой задачи сельдерея. Этот предыдущий вопрос может помочь. Обратите внимание на предостерегающие упоминания о безопасности: -)