Encontré que puedo configurar la tarea para que se ejecute a intervalos específicos en momentos específicos desde here, pero eso solo se hizo durante la declaración de la tarea. ¿Cómo configuro una tarea para que se ejecute periódicamente de forma dinámica?apio django: cómo configurar la tarea para que se ejecute a intervalos específicos programáticamente
apio django: cómo configurar la tarea para que se ejecute a intervalos específicos programáticamente
Respuesta
El horario es derived from a setting, y por lo tanto parece ser inmutable en tiempo de ejecución.
Probablemente pueda lograr lo que está buscando usando Task ETAs. Esto garantiza que su tarea no se ejecutará antes de el tiempo deseado, pero no promete ejecutar la tarea en el momento designado; si los trabajadores están sobrecargados en la ETA designada, la tarea puede ejecutarse más tarde.
Si esta restricción no es un problema, se podría escribir una tarea que sería primera funcionar por sí mismo como:
@task
def mytask():
keep_running = # Boolean, should the task keep running?
if keep_running:
run_again = # calculate when to run again
mytask.apply_async(eta=run_again)
# ... do the stuff you came here to do ...
La principal desventaja de este enfoque es que usted está confiando en la taskstore recordar las tareas en vuelo Si uno de ellos falla antes de disparar el siguiente, entonces la tarea nunca volverá a ejecutarse. Si su intermediario no persiste en el disco y muere (llevando todas las tareas en vuelo con él), entonces ninguna de esas tareas se ejecutará nuevamente.
Puede resolver estos problemas con algún tipo de registro de transacciones y una tarea periódica de "niñera" cuyo trabajo es encontrar tales tareas repetitivas que mueren prematuramente y revivirlas.
Si tuviera que implementar lo que ha descrito, creo que así es como lo abordaría.
ver aquí http://docs.celeryproject.org/en/latest/userguide/periodic-tasks.html
creo que no se puede hacer de forma dinámica ... mejor manera es crear tareas en la tarea: D
por ejemplo, desea ejecutar algo por X segundos más tarde, entonces se crea nueva tarea con x sec delay y en esta tarea crear otra tarea para N * X sec delay ...
celery.task.base.PeriodicTask
define is_due
que determina cuándo debería ser la próxima ejecución. Puede anular esta función para contener su lógica de ejecución dinámica personalizada. Consulte la documentación aquí: http://docs.celeryproject.org/en/latest/reference/celery.task.base.html?highlight=is_due#celery.task.base.PeriodicTask.is_due
Un ejemplo:
import random
from celery.task import PeriodicTask
class MyTask(PeriodicTask):
def run(self, **kwargs):
logger = self.get_logger(**kwargs)
logger.info("Running my task")
def is_due(self, last_run_at):
# Add your logic for when to run. Mine is random
if random.random() < 0.5:
# Run now and ask again in a minute
return (True, 60)
else:
# Don't run now but run in 10 secs
return (True, 10)
¿me puede dar un ejemplo de cómo anular durante el tiempo de ejecución? Supongo que no puedo usar .delay porque no hay run() para classesTask classes – goh
Usted define su propia clase de programación (apio.schedules.schedule) con un método personalizado is_due. 'CELERYBEAT_SCHEDULE = {" my name ": {" task ":" myapp.mytask ", schedule": myschedule()}} ' – asksol
Esto debería ayudar a algunos ... http://celery.readthedocs.org/en/latest/faq.html#can-i-change-the-interval-of-a-periodic-task-at-runtime
Una vez que haya definido una programación personalizada, asignarlo a su tarea como asksol tiene sugerido arriba
CELERYBEAT_SCHEDULE = {
"my_name": {
"task": "myapp.tasks.task",
"schedule": myschedule(),
}
}
También puede ser que desee modificar CELERYBEAT_MAX_LOOP_INTERVAL si desea que su horario para actualizar con mayor frecuencia que cada cinco minutos.
- 1. ¿Cómo programo que una tarea se ejecute a intervalos periódicos?
- 2. Django apio - cómo enviar request.FILES [ 'foto'] a la tarea
- 3. ejecutar una tarea a intervalos específicos en Python
- 4. Cómo garantizar que una tarea de apio esté evitando la superposición de las ejecuciones de la tarea de apio
- 5. ¿Cómo configurar una tarea CRON para que se ejecute solo una vez por conjunto de instancias?
- 6. Cómo generar programáticamente entradas de celerybeat con apio y Django
- 7. Evitar que se ejecute la tarea en segundo plano dispatch_after()
- 8. ¿Cómo puedo retrasar una tarea usando Apio?
- 9. programación de la tarea de apio (Asegurar una tarea se ejecuta sólo uno a la vez)
- 10. Tarea de apio que ejecuta más tareas
- 11. Enrutar la tarea de apio a la cola específica
- 12. Anular una tarea en ejecución en Apio dentro de django
- 13. ¿Cómo saber si una tarea ya se ha puesto en cola en django-apio?
- 14. ¿Cancelar una tarea que ya se está ejecutando con Apio?
- 15. cómo evitar que Sinatra se ejecute?
- 16. Cómo diagnosticar a los trabajadores de apio que se cuelgan
- 17. Django y apio: ¿Cómo programo que un trabajo se ejecute solo una vez usando apio (similar al comando "a" en linux)?
- 18. Prueba si todavía se está procesando una tarea de apio
- 19. Cómo hacer que una tarea de apio falle dentro de la tarea?
- 20. Apio con Django - despliegue
- 21. Apio: obtenga la identificación de la tarea para la tarea actual
- 22. cómo depurar tareas Apio/Django se ejecutan localmente en Eclipse
- 23. Restablecer la cuenta atrás en la tarea de apio
- 24. Ejecutar una tarea de Apio cuando no se puede importar esa tarea
- 25. eliminar tarea/PeriodicTask en apio
- 26. Libro para Django + Apio + RabbitMQ?
- 27. Django Señales en el apio
- 28. Inhabilitar la depuración de Django para el apio
- 29. Django y apio: problemas de enrutamiento
- 30. Cómo programar una tarea para que se ejecute al cerrar ventanas
Sí, el planificador no está optimizado para las planificaciones dinámicas, pero puede implementar su propio 'Schedule' con un método' is_due' como se describe anteriormente, y tener la tarea reprogramarse es una opción que muchos usan, pero luego necesita asegúrese de que la primera tarea siempre se active, lo cual no es tan fácil. Otra opción es utilizar el DatabaseScheduler en django-apio, esto admite horarios dinámicos y también se puede usar fuera de los proyectos de Django. Además, crear tus propios programadores no es tan difícil. – asksol
@asksol, la documentación para django-apio está vacía.¿Dónde puedo encontrar información sobre cómo usar databaseScheduler? – goh
@amateur Bueno, la documentación es muy escasa aquí: – asksol