Chciałbym dodać opóźnienie arbitralnych zadań przy użyciu django-celery
. Obecnie Stworzyłem klasę podobny do tego poniżej (to tylko przykład, rzeczywiste klasy mają więcej niż to):django-celery: Dynamiczne tworzenie i rejestrowanie zadania
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)
biegnę celeryd następująco:
python manage.py celeryd -E -B -lDEBUG
Kiedy próbuję działa mój sposób opóźnienia od wewnątrz skorupy django [np Delayer().delay(lambda: 1, 1)
] dostaję błąd jak ten w moim wyjściu 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"
Moje pytanie brzmi, czy jest możliwe, aby zarejestrować takie dynamicznie creat ed zadań? Jeśli nie, to jakiej innej metody mogę użyć do osiągnięcia tego samego efektu przy użyciu selera?