2012-08-15 12 views
6

¿Hay alguna manera de decirle a celerybeat que cambie la configuración de una tarea específica mientras se está ejecutando?Cambios dinámicos en la configuración de compilación de apio

La utilidad de este se ilustra mejor en este ejemplo:

I tienen una tarea periódica que comprueba un valor cada 30 segundos. A veces, en función de un disparador externo (que no puedo predecir), querré que esta tarea aumente la frecuencia de sondeo a 10 s, durante unos minutos.

¿Es esto factible de una manera manejable? Sé que puedo cambiar la configuración de la tarea y volver a cargar el apio pero que parece un modo desordenado de hacer las cosas ...

+0

¿Encontró una manera? –

+1

@ CésarBustíos en realidad no. Terminó la construcción de un planificador interno sobre el apio. Creo que es más un uso previsto de la biblioteca. – Goro

Respuesta

3

En el módulo schedules.py se encuentra esta:

class schedule(object): 

    def is_due(self, last_run_at): 
     """Returns tuple of two items `(is_due, next_time_to_run)`, 
     where next time to run is in seconds. 

     e.g. 

     * `(True, 20)`, means the task should be run now, and the next 
      time to run is in 20 seconds. 

     * `(False, 12)`, means the task should be run in 12 seconds. 

     You can override this to decide the interval at runtime, 
     but keep in mind the value of :setting:`CELERYBEAT_MAX_LOOP_INTERVAL`, 
     which decides the maximum number of seconds celerybeat can sleep 
     between re-checking the periodic task intervals. So if you 
     dynamically change the next run at value, and the max interval is 
     set to 5 minutes, it will take 5 minutes for the change to take 
     effect, so you may consider lowering the value of 
     :setting:`CELERYBEAT_MAX_LOOP_INTERVAL` if responsiveness is of 
     importance to you. 

     .. admonition:: Scheduler max interval variance 

     The default max loop interval may vary for different schedulers. 
     For the default scheduler the value is 5 minutes, but for e.g. 
     the django-celery database scheduler the value is 5 seconds. 

     """ 
     last_run_at = self.maybe_make_aware(last_run_at) 
     rem_delta = self.remaining_estimate(last_run_at) 
     rem = timedelta_seconds(rem_delta) 
     if rem == 0: 
      return True, self.seconds 
     return False, rem 

Por lo tanto, se puede reemplazar el método is_due para establecer su propio timedelta.

+0

teniendo problemas con esto. cuando regreso (cierto, 10) simplemente sigue volviendo a ejecutar la tarea en menos de un segundo. se siente como un problema de fecha y hora – dtc

Cuestiones relacionadas