2012-01-19 18 views
65

Ho letto il documento e la ricerca, ma non riesco a trovare una risposta chiara:Annullare un'attività già in esecuzione con Celery?

Puoi annullare un compito già in esecuzione? (Come nel compito ha avviato, prende un po ', e metà ha bisogno di essere annullato)

ho trovato questo dalla doc presso Celery FAQ

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

Ma io sono chiaro se questo si annulla in coda attività o se uccide un processo in esecuzione su un lavoratore. Grazie per la luce che puoi versare!

risposta

116

revoca annulla l'esecuzione dell'attività. Se un'attività viene revocata, i lavoratori ignorano l'attività e non la eseguono. Se non si utilizzano revisioni persistenti, l'attività può essere eseguita dopo il riavvio del lavoratore.

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

revoca ha un'opzione che è interrompere False per impostazione predefinita. Se è necessario interrompere l'attività in esecuzione, è necessario impostare termina su 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

Questa è esattamente la spiegazione che stavo cercando, grazie! – dcoffey3296

+0

Funziona in un ambiente distribuito? Voglio dire se ho lavoratori su più macchine che eseguono compiti. Il sedano tiene traccia di quale macchina sta eseguendo l'attività? – ksrini

+0

Lo fa. La comunicazione con i lavoratori avviene tramite il broker. – mher

0

Vedere le seguenti opzioni per le attività: time_limit, soft_time_limit (oppure è possibile impostarlo per i lavoratori). Se si desidera controllare non solo il tempo di esecuzione, consultare l'argomento expires del metodo apply_async.

24

In sedano 3.1, il API of revoking tasks è cambiato.

Secondo il Celery FAQ, si dovrebbe usare result.revoke:

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

o se avete solo l'ID attività:

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

@ risposta di 0x00mh è corretta, tuttavia recente sedano docs dicono che l'utilizzo dell'opzione terminate è "l'ultima risorsa per gli amministratori" perché si può terminare accidentalmente un'altra attività che ha iniziato l'esecuzione nel frattempo. Probabilmente una soluzione migliore è la combinazione di terminate=True con signal='SIGUSR1' (che causa l'eccezione SoftTimeLimitExceeded da sollevare nell'attività).

Problemi correlati