¿Cancelar una tarea ya en ejecución con Celery?

He estado leyendo el documento y buscando, pero parece que no puedo encontrar una respuesta directa:

¿Se puede cancelar una tarea ya en ejecución? (como en la tarea ha comenzado, toma un tiempo, y la mitad del proceso necesita ser cancelada)

Encontré esto del documento en Celery Preguntas frecuentes

>>> 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!

revocar cancela la ejecución de la tarea. Si se revoca una tarea, los trabajadores ignoran la tarea y no la ejecutan. Si no utiliza revocaciones persistentes, su tarea se puede ejecutar después de reiniciar el trabajador.

http://docs.celeryproject.org/en/latest/userguide/workers.html#worker-persistent-revokes

revocar tiene una opción de terminación que es False por defecto. Si necesita finalizar la tarea en ejecución, debe establecer terminate en True .

 >>> from celery.task.control import revoke >>> revoke(task_id, terminate=True) 

http://docs.celeryproject.org/en/latest/userguide/workers.html#revoke-revoking-tasks

En Celery 3.1, se modifica la API de revocar tareas .

De acuerdo con las Preguntas frecuentes sobre el apio , debe usar result.revoke:

 >>> result = add.apply_async(args=[2, 2], countdown=120) >>> result.revoke() 

o si solo tienes el id de tarea:

 >>> from proj.celery import app >>> app.control.revoke(task_id) 

La respuesta de @ 0x00mh es correcta, sin embargo, los documentos recientes de apio dicen que usar la opción de terminate es ” un último recurso para los administradores ” porque puede terminar accidentalmente otra tarea que comenzó a ejecutarse mientras tanto. Posiblemente una mejor solución sea combinar terminate=True con signal='SIGUSR1' (lo que hace que la excepción SoftTimeLimitExceeded se genere en la tarea).

Consulte 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, vea el argumento expira del método apply_async.

Además, insatisfactorio, hay otra forma (abortar tarea) para detener la tarea, pero hay muchos aspectos poco confiables, más detalles, consulte: http://docs.celeryproject.org/en/latest/reference/celery.contrib.abortable .html