He estado leyendo el documento y buscando, pero parece que no puedo encontrar una respuesta directa:
¿Puede cancelar una tarea que ya se está ejecutando? (ya que la tarea ha comenzado, lleva un tiempo y la mitad debe cancelarse)
Encontré esto en el documento en Preguntas frecuentes sobre apio
>>> result = add.apply_async(args=[2, 2], countdown=120)
>>> result.revoke()
Pero no tengo claro si esto cancelará las tareas en cola o si matará un proceso en ejecución en un trabajador. ¡Gracias por cualquier luz que puedas arrojar!
fuente
En Celery 3.1, se cambia la API de revocación de tareas .
De acuerdo con las preguntas frecuentes sobre apio , debe usar result.revoke:
>>> result = add.apply_async(args=[2, 2], countdown=120) >>> result.revoke()
o si solo tiene la identificación de la tarea:
>>> from proj.celery import app >>> app.control.revoke(task_id)
fuente
La respuesta de @ 0x00mh es correcta, sin embargo, los documentos recientes de apio dicen que usar la
terminate
opción es " un último recurso para los administradores " porque puede terminar accidentalmente otra tarea que comenzó a ejecutarse mientras tanto. Posiblemente una mejor solución es combinarterminate=True
consignal='SIGUSR1'
(lo que hace que se genere la excepción SoftTimeLimitExceeded en la tarea).fuente
SoftTimeLimitExceeded
se genera en mi tarea, se invoca mi lógica de limpieza personalizada (implementada a través detry
/except
/finally
). Esto es mucho mejor, en mi opinión, que lo queAbortableTask
ofrece ( docs.celeryproject.org/en/latest/reference/… ). Con este último, necesita un backend de resultados de base de datos y debe verificar manual y repetidamente el estado de una tarea en curso para ver si ha sido cancelada.worker_prefetch_multiplier = 1
ya que solo tengo algunas tareas de ejecución prolongada, la terminación debería estar bien, ya que no se realizarán otras tareas al terminar, ¿entendí esto correctamente? @spicyramenConsulte las siguientes opciones para las tareas: time_limit , soft_time_limit (o puede configurarlo para los trabajadores). Si desea controlar no solo el tiempo de ejecución, consulte el argumento expires del método apply_async.
fuente
Además, insatisfactorio, hay otra forma (abortar tarea) para detener la tarea, pero hay mucha falta de confiabilidad, más detalles, ver: http://docs.celeryproject.org/en/latest/reference/celery.contrib.abortable .html
fuente