2013-06-06 9 views
23

Di Sedano impostazione predefinita inviare tutti i compiti da 'il sedano' coda, ma è possibile modificare questo comportamento con l'aggiunta di parametro in più:Come inviare task periodici alla coda specifica nel sedano

@task(queue='celery_periodic') 
def recalc_last_hour(): 
    log.debug('sending new task') 
    recalc_hour.delay(datetime(2013, 1, 1, 2)) # for example 

impostazioni Scheduler:

CELERYBEAT_SCHEDULE = { 
    'installer_recalc_hour': { 
     'task': 'stats.installer.tasks.recalc_last_hour', 
     'schedule': 15 # every 15 sec for test 
    }, 
} 
CELERYBEAT_SCHEDULER = "djcelery.schedulers.DatabaseScheduler" 

Run lavoratore:

python manage.py celery worker -c 1 -Q celery_periodic -B -E 

Questo schema non funziona come previsto: questo i lavoratori invia task periodici t o 'coda di sedano', non 'celery_periodic'. Come posso ripararlo?

P.S. sedano == 3.0.16

+0

questo può essere utile? http://docs.celeryproject.org/en/latest/userguide/routing.html – oleg

+0

Ho spento opzione CELERYBEAT_SCHEDULER (usato stoprage basato su file) e funziona correttamente. –

risposta

17

Ho trovato la soluzione per questo problema:

1) Prima di tutto ho cambiato il modo in cui per la configurazione task periodici. Ho usato @periodic_task decoratore in questo modo:

@periodic_task(run_every=crontab(minute='5'), 
       queue='celery_periodic', 
       options={'queue': 'celery_periodic'}) 
def recalc_last_hour(): 
    dt = datetime.utcnow() 
    prev_hour = datetime(dt.year, dt.month, dt.day, dt.hour) \ 
       - timedelta(hours=1) 
    log.debug('Generating task for hour %s', str(prev_hour)) 
    recalc_hour.delay(prev_hour) 

2) Ho scritto celery_periodic due volte in params per @periodic_task:

  • coda = 'celery_periodic' opzione viene utilizzata quando si richiama compito dal codice (.delay o .apply_async)

  • opzioni = { 'coda': 'celery_periodic'} opzione viene utilizzata quando sedano battuto invoca.

Sono sicuro che la stessa cosa è possibile se si configurano le attività periodiche con la variabile CELERYBEAT_SCHEDULE.

UPD. Questa soluzione è corretta sia per l'archiviazione basata su DB che per quella basata su file per CELERYBEAT_SCHEDULER.

+0

@periodic_task (se ho capito bene) sono deprecati in questo momento – StErMi

+0

@StErMi sì, che non funzionerà. – iankit

25

periodica sono inviati alle code da celerybeat.You può fare ogni cosa che facciamo con sedano api. Ecco l'elenco delle configurazioni fornito con celerybeat.

http://celery.readthedocs.org/en/latest/userguide/periodic-tasks.html#available-fields

Nel tuo caso

CELERYBEAT_SCHEDULE = { 
    'installer_recalc_hour': { 
     'task': 'stats.installer.tasks.recalc_last_hour', 
     'schedule': 15 # every 15 sec for test, 
     'options': {'queue' : 'celery_periodic'} ##options are mapped to apply_async options 
    }, 
} 
+7

Questa dovrebbe essere la risposta accettata? – Buttons840

+0

Beh, entrambi rispondono alla domanda in un modo ... Tuttavia, sono d'accordo sul fatto che questa risposta sia leggermente migliore di quella accettata perché l'autore della domanda ha chiesto di cambiare CELERYBEAT_SCHEDULE ... – DejanLekic

2

E se si utilizza djcelery scheduler di database, è possibile specificare la coda sul Opzioni di esecuzione -> campo coda

Problemi correlati