2013-01-02 18 views
10

Mi piacerebbe aggiungere il ritardo di attività arbitrarie utilizzando django-celery. Attualmente, ho creato una classe simile a quello qui sotto (solo un esempio, le classi attuali hanno più di questo):django-sedano: crea e registra dinamicamente un'attività

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) 

Io corro celeryd come segue:

python manage.py celeryd -E -B -lDEBUG 

quando provo in esecuzione il mio metodo di ritardo dal di dentro un guscio Django [ad es Delayer().delay(lambda: 1, 1)], sto ottenendo un errore come questo nel mio uscita 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" 

la mia domanda è, è possibile registrare tali dinamicamente creat compiti? In caso contrario, quale altro metodo posso utilizzare per ottenere lo stesso effetto con il sedano?

risposta

10

La semplice risposta è che non è possibile; Poiché Celery è in esecuzione in un processo diverso, deve essere in grado di importare qualsiasi codice eseguito come un compito di sedano; il tuo callable generato non lo è, quindi il modo in cui sedano i riferimenti ai callables non funziona.

Tuttavia questo suggerisce un possibile modo di attaccare le cose: se riesci a inventare un modo diverso di serializzare il tuo callable, allora puoi fornirlo come argomento per un semplice compito di sedano. This previous question potrebbe aiutare. Nota le avvertenze di sicurezza cautelative :-)

Problemi correlati