2012-03-03 16 views
11

Spero di essere in grado di generare in modo programmatico le voci di celerybeat e risincronizzare il celerybeat quando vengono aggiunte voci. La documentazione here stataliCome generare in modo programmato le voci di celerybeat con sedano e Django

By default the entries are taken from the CELERYBEAT_SCHEDULE setting, but custom stores can also be used, like storing the entries in an SQL database.

Così sto cercando di capire quali classi ho bisogno di estendere per essere in grado di farlo.

Sono stato a guardare celery scheduler docs e djcelery api docs ma la documentazione su ciò che alcuni di questi metodi non è inesistente così da immergersi in qualche fonte e speravo solo che qualcuno potesse indicarmi la giusta direzione.

Immagino che un alto livello di quello che sto facendo sarebbe utile ... Come utente devo essere in grado di selezionare da una serie predefinita di compiti e fornire un modo per un utente di selezionare una sorta di personalizzato programma per l'esecuzione, come ogni giorno/settimana/mese e che giorno e ora.

Anche questo è in Django con djcelery.

UPDATE

vedo il codice per l'amministratore djcelery, ma non mi è chiaro il modo in cui viene persisteva tali dati. Al momento ho un generico addTask vista che assomiglia a questo:

def addTask(request): 

intervalSchedule = IntervalSchedule.from_schedule(schedule(timedelta(seconds=10))) 
intervalSchedule.save() 
modelData = dict(
    name="dcTestPersist", 
    task="technologytrackerapi.views.createRecord", 
    schedule=intervalSchedule, 
) 
periodicTask = PeriodicTask(**modelData) 
periodicTask.save() 
return render_to_response('taskView.html') 

I dati sembra corretto nel db, ma quando il demone lo gestisce ha questo errore:

[2012-03-06 00:23:07,926: WARNING/Beat] Process Beat:
[2012-03-06 00:23:07,926: WARNING/Beat] Traceback (most recent call last):
[2012-03-06 00:23:07,926: WARNING/Beat] File "/usr/lib/python2.7/multiprocessing/process.py", line 258, in _bootstrap
[2012-03-06 00:23:07,926: WARNING/Beat] self.run()
[2012-03-06 00:23:07,927: WARNING/Beat] File "/home/dchesterman/Documents/PythonDev/.virtualenvs/ros/local/lib/python2.7/site-packages/celery/beat.py", line 464, in run
[2012-03-06 00:23:07,927: WARNING/Beat] self.service.start(embedded_process=True)
[2012-03-06 00:23:07,927: WARNING/Beat] File "/home/dchesterman/Documents/PythonDev /.virtualenvs/ros/local/lib/python2.7/site-packages/celery/beat.py", line 403, in start
[2012-03-06 00:23:07,927: WARNING/Beat] interval = self.scheduler.tick()
[2012-03-06 00:23:07,927: WARNING/Beat] File "/home/dchesterman/Documents/PythonDev/.virtualenvs/ros/local/lib/python2.7/site-packages/celery/beat.py", line 194, in tick
[2012-03-06 00:23:07,927: WARNING/Beat] next_time_to_run = self.maybe_due(entry, self.publisher)
[2012-03-06 00:23:07,927: WARNING/Beat] File "/home/dchesterman/Documents/PythonDev/.virtualenvs/ros/local/lib/python2.7/site-packages/celery/beat.py", line 170, in maybe_due
[2012-03-06 00:23:07,927: WARNING/Beat] is_due, next_time_to_run = entry.is_due()
[2012-03-06 00:23:07,928: WARNING/Beat] File "/home/dchesterman/Documents/PythonDev/.virtualenvs/ros/local/lib/python2.7/site-packages/djcelery/schedulers.py", line 54, in is_due
[2012-03-06 00:23:07,928: WARNING/Beat] return self.schedule.is_due(self.last_run_at)
[2012-03-06 00:23:07,928: WARNING/Beat] AttributeError: 'NoneType' object has no attribute 'is_due'

io non sono sicuro perché il mio schedule non utilizza il valore predefinito is_due()

risposta

6

Questo è ciò che ha finito per lavorare per me:

def addTask(request): 

    intervalSchedule = IntervalSchedule.from_schedule(schedule(timedelta(seconds=10))) 
    intervalSchedule.save() 

    modelData = dict(
     name="dcTestPersist", 
     task="technologytrackerapi.tasks.createRecord", 
     interval_id=intervalSchedule.pk, 
) 

    periodicTask = PeriodicTask(**modelData) 
    periodicTask.save() 

    me = ModelEntry(periodicTask) 

    try: 
     me.save() 

    except: 
    from django.db import connection 
    print connection.queries 
    raise 

    return render_to_response('taskView.html') 

ho dovuto avvolgere la periodica attività in un ModelEntry.

+0

Per qualche motivo non capisco, ho seguito questo creando l'attività pianificata e non ho dovuto eseguire il wrapping con 'ModelEntry'. Non so perché o cosa sia 'ModelEntry'. Nota a caso - Stavo anche impostando "scade" ed ero perplesso di non avere alcun effetto. Ha * ha * un effetto, ma su 'celeryd' not' celerybeat' - '' celerybeat' continua ad attivarsi indefinitamente, ma dopo 'expires'' 'celeryd' lo ignora (stato' revocato'). – Chris

+0

Fa parte di djcelery che è un'integrazione con django. Non sono sicuro se lo stai usando. https://github.com/celery/django-celery Ne dubito. Sembra deprecato. Questo ha 4 anni. – Dustin

+0

@ Dustin scusa non è stato tanto chiedere come prendere appunti per altri che potrebbero venire in seguito. La tua risposta è l'esempio più semplice di pianificare periodicamente un PeriodicTask per CeleryBeat su Internet! Il resto usa il file di configurazione o fornisce solo una parte della risposta. (Sto usando djcelery - penso che sia da dove proviene il back-end del database, e I' da djcelery.models import * '.) – Chris

Problemi correlati