2013-01-02 15 views
10

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?

Odpowiedz

10

Prosta odpowiedź brzmi, że nie możesz; ponieważ seler działa w innym procesie, musi mieć możliwość importowania dowolnego kodu, który jest uruchamiany jako zadanie selerowe; twoja generowana podpowiedź nie jest, więc sposób selera na poruszanie odniesień do podpalaczy nie działa.

Jednak sugeruje to możliwy sposób ataku na rzeczy: jeśli możesz wymyślić inny sposób serializacji na żądanie, możesz podać go jako argument do prostego zadania związanego z selerem. This previous question może pomóc. Zwróć uwagę na ostrzeżenia o bezpieczeństwie :-)

Powiązane problemy