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)
Gracias por esta respuesta extremadamente completa. –