2010-07-28 3 views
6

Non si parla del metodo delay.Come posso ritardare un'attività utilizzando Celery?

Voglio essere in grado di ottenere un compito, dato che è task_id e si cambia ETA al volo, prima che venga eseguito.

Per ora devo annullarlo e riprogrammare uno. Difficile se il processo programmato coinvolge un sacco di cose.

+0

Quindi sei riuscito a farlo alla fine? – julkiewicz

+0

È possibile ritardare qualsiasi attività utilizzando * celery *, a condizione che definisca l'attività come "assorbire calorie". ;-) http://wiki.answers.com/Q/Is_it_true_that_celery_has_negative_calories – Sam

+0

@Sam lold, thx. – julkiewicz

risposta

1

È necessario memorizzare un valore di "pausa" al di fuori di sedano/coda di attività. Lo faccio con un mailer usando il sedano. Posso mettere in pausa parti del sistema impostando valori in memcache o mysql. Le attività quindi assicurano di interrogare la risorsa esterna prima di eseguire l'attività. Se è destinato a essere messo in pausa, lo imposta fa un task.retry() che lo fa passare attraverso il tempo di ritardo dei tentativi e così via.

+0

Lo prpose per rimuovere l'attività dalla coda. Se è solo quello che suggerisci, il contributo di AbortableTask lo fa già. –

1

Supponendo che si utilizzi django-sedano e PeriodicTask con DatabaseScheduler, è necessario modificare l'intervallo PeriodicTask o crontab e salvarlo. Se l'attività è definita da un intervallo, modificare la proprietà last_run_at.

Si esegue celerybeat con lo scheduler database con:

python manage.py celerybeat -S djcelery.schedulers.DatabaseScheduler 
+1

Il problema è che gli intervalli non sono uniformi, quindi sfortunatamente non sto usando PeriodicTask. Devo fare esattamente ciò che è stato specificato nella domanda. – julkiewicz