Я хотел бы добавить задержку произвольных задач с помощью 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"
Мой вопрос: возможно ли зарегистрировать такие динамически созданные задачи? Если нет, то какой другой метод я могу использовать для достижения такого же эффекта с использованием сельдерея?