2012-01-19 14 views
65

He estado leyendo el documento y buscando pero no puedo encontrar una respuesta directa:¿Cancelar una tarea que ya se está ejecutando con Apio?

¿Puede cancelar una tarea que ya se está ejecutando? (Como en la tarea ha comenzado, toma un tiempo, ya mitad de camino a través de ella necesita ser cancelada)

me encontré con esto desde el doc en Celery FAQ

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

Pero no tengo muy claro si esto se cancelará en cola tareas o si eso matará un proceso en ejecución en un trabajador. Gracias por cualquier luz que puedas arrojar!

Respuesta

116

revoque cancela la ejecución de la tarea. Si se revoca una tarea, los trabajadores ignoran la tarea y no la ejecutan. Si no usa revocaciones persistentes, su tarea se puede ejecutar después del reinicio del trabajador.

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

revocación tiene una opción por terminado que es falso por defecto. Si necesita eliminar la tarea de ejecución, debe configurar terminar 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

+0

¡Esta es exactamente la explicación que estaba buscando, gracias! – dcoffey3296

+0

¿Funciona esto en un entorno distribuido? Quiero decir, si tengo trabajadores en varias máquinas que están ejecutando tareas. ¿El apio realiza un seguimiento de qué máquina se está ejecutando la tarea? – ksrini

+0

Lo hace. La comunicación con los trabajadores se lleva a cabo a través del intermediario. – mher

0

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 expires del método apply_async.

24

en el apio 3.1, el API of revoking tasks se cambia.

De acuerdo con la Celery FAQ, se debe utilizar result.revoke:

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

o si sólo tiene el ID de tarea:

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

@ respuesta de 0x00mh es correcto, sin embargo reciente apio docs dicen que utilizando la opción 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 es combinar terminate=True con signal='SIGUSR1' (lo que provoca que la excepción SoftTimeLimitExceeded se levante en la tarea).

Cuestiones relacionadas