2011-11-22 20 views
7

He logrado que las tareas periódicas funcionen en django-apio mediante la subclase de PeriodicTask. Intenté crear una tarea de prueba y configurarla ejecutando algo inútil. Funciona.Detención/depuración de tareas periódicas en Django-Apio

Ahora no puedo detenerlo. He leído la documentación y no puedo encontrar la manera de eliminar la tarea de la cola de ejecución. He intentado usar el apio y usar el intérprete de comandos, pero registry.tasks() está vacío, así que no puedo ver cómo eliminarlo.

He visto sugerencias de que debería "revocarlo", pero para esto parece que necesito una identificación de la tarea, y no puedo ver cómo encontraría la identificación de la tarea.

Gracias.

Respuesta

21

Una tarea es un mensaje y una "tarea periódica" envía mensajes de tareas a intervalos periódicos. A cada una de las tareas enviadas se le asignará una identificación única.

revoke solo cancelará un solo mensaje de tarea. Para obtener la identificación para una tarea, debe mantener la pista de la identificación enviada, pero también puede especificar una identificación personalizada cuando envíe una tarea.

No estoy seguro de si desea cancelar un mensaje de una sola tarea, o si desea evitar que la tarea periódica envíe más mensajes, entonces enumeraré las respuestas para ambos.

No hay manera integrada para mantener el id de una tarea enviada con tareas periódicas, pero se puede establecer el ID de cada tarea para el nombre de la tarea periódica, de esa manera el id se referirá a cualquier tarea enviada con la tarea periódica (generalmente la última). Se puede especificar un ID personalizado de esta manera,

ya sea con el @periodic_task decorador:

@periodic_task(options={"task_id": "my_periodic_task"}) 
def my_periodic_task(): 
    pass 

o con el entorno CELERYBEAT_SCHEDULE:

CELERYBEAT_SCHEDULE = {name: {"task": task_name, 
           "options": {"task_id": name}}} 

Si desea eliminar una tarea periódica que simplemente elimine @periodic_task de la base de código o elimine la entrada de CELERYBEAT_SCHEDULE. Si está utilizando el planificador de la base de datos Django, debe eliminar la tarea periódica de la interfaz de administración de Django.

PS1: revoke no detiene una tarea que ya se ha iniciado. Solo cancela las tareas que aún no se han iniciado. Puede finalizar una tarea en ejecución usando revoke(task_id, terminate=True). De forma predeterminada, esto enviará la señal TERM al proceso , si desea enviar otra señal (por ejemplo, KILL) use revoke(task_id, terminate=True, signal="KILL").

PS2: revoke es un comando de control remoto por lo que solo es compatible con RabbitMQ y Redis broker transportes. Si desea que su tarea de apoyo a la cancelación debe hacerlo mediante el almacenamiento de una bandera cancelled en una base de datos y tienen la tarea de comprobar que la bandera cuando se inicia:

from celery.task import Task 

class RevokeableTask(Task): 
    """Task that can be revoked. 

    Example usage: 

     @task(base=RevokeableTask) 
     def mytask(): 
      pass 
    """ 

    def __call__(self, *args, **kwargs): 
     if revoke_flag_set_in_db_for(self.request.id): 
      return 
     super(RevokeableTask, self).__call__(*args, **kwargs) 
+0

Gracias por esta respuesta extremadamente completa. –

3

Sólo en caso de que esto puede ayudar a alguien ... Tuvimos el mismo problema en el trabajo, y a pesar de algunos esfuerzos para encontrar algún tipo de comando de gestión para eliminar la tarea periódica, no pudimos. Aquí hay algunos consejos.

Probablemente primero deba volver a verificar qué scheduler class está utilizando.

El programador predeterminado es aplery.beat.PersistentScheduler, que simplemente hace un seguimiento de los últimos tiempos de ejecución en un archivo de base de datos local (una estantería).

En nuestro caso, estábamos usando la clase djcelery.schedulers.DatabaseScheduler.

django-apio también se suministra con un programador que almacena el programa en la base de datos de Django

Aunque la documentación menciona una forma de eliminar las tareas periódicas:

Uso planificador de django-apio, puede agregar, modificar y eliminar tareas periódicas del administrador de Django.

Queríamos realizar la eliminación mediante programación, o mediante un comando (apio/gestión) en un shell.

Ya que no pudimos encontrar una línea de comandos, se utilizó la cáscara de Django/Python:

$ python manage.py shell 
>>> from djcelery.models import PeriodicTask 
>>> pt = PeriodicTask.objects.get(name='the_task_name') 
>>> pt.delete() 

espero que esto ayude!

Cuestiones relacionadas