Pregunta

¿Cuál es una manera eficiente de calcular el siguiente tiempo de ejecución de un evento dado el tiempo actual y una especificación de cron?

Estoy buscando algo distinto de "bucle a través de todos los cheques minutos si coincide con las especificaciones".

Ejemplos de características podrían ser:

  • Todos los meses, los días 1 y 15 a las 15:01
  • En 10,20,30,40,50 minutos después de la hora cada hora

código Python sería precioso pero pseudo código o descripción de alto nivel también sería apreciada.

[Actualización] Supongamos que la especificación ya se analiza y se encuentra en un formato razonable.

¿Fue útil?

Solución

Con solo mirarlo, creo que es necesario:

  • analizar la especificación Chron a cinco matrices que contienen valores aceptables para cada campo;
  • análisis sintáctico 'ahora' a un valor para cada campo;
  • en el orden de minutos, horas, {día de mes o el día de la semana}, meses del año:. Encontrar el valor de la matriz más bajo que iguala o supera el valor actual, la corrección de transporte

No sé cómo manejar los días de la semana y el día de mes de forma simultánea; Estoy seguro de que hay una manera, pero por otro lado no creo que he visto una especificación que de hecho especifica ambos. Creo que sería suficiente para escribir un controlador para cualquiera y generará un error si recibe ambos.

Editar al parecer, si el día de la semana y el día de mes se especifican ambas, que se supone que el fuego en ambos - es decir, si la regla es ' 15a, miércoles' que se disparará en cada 15 de y todos los miércoles.

El paquete croniter hace lo que quiere:

import croniter
import datetime

now = datetime.datetime.now()
sched = '1 15 1,15 * *'    # at 3:01pm on the 1st and 15th of every month
cron = croniter.croniter(sched, now)

for i in range(4):
    nextdate = cron.get_next(datetime.datetime)
    print nextdate

impresiones

2011-01-15 15:01:00
2011-02-01 15:01:00
2011-02-15 15:01:00
2011-03-01 15:01:00

A pesar de que sería bueno si se escribe como un iterador real. Tal vez tengo mi próximo proyecto; -)

Otros consejos

Later.js es una biblioteca JavaScript que hace precisamente esto. Es capaz de analizar una expresión Cron y luego calcular las futuras apariciones de la programación. Es algoritmo no es muy sofisticado, pero hace el trabajo. Podría valer la pena un vistazo.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top