2010-08-26 13 views
6

Vorrei poter interrompere un'attività in esecuzione da una coda di Celery (utilizzando rabbitMQ). Chiamare l'attività utilizzandoInterrompere un'attività in esecuzione in Celery all'interno di django

task_id = AsyncBoot.apply_async(args=[name], name=name, connect_timeout=3) 

dove AsyncBoot è un'attività definita.

È possibile ottenere l'ID dell'attività (supponendo che sia la stringa lunga che restituisce apply_async) e memorizzarlo in un database, ma non sono sicuro su come chiamare un metodo di interruzione. Vedo come rendere i metodi più comodi con la classe di attività Abortable, ma se ho solo la stringa id-task, come posso chiamare .abort() sull'attività? Grazie.

risposta

10

apply_async restituisce un'istanza AsyncResult, o in questo caso un AbortableAsyncResult. Salvare lo task_id e utilizzarlo per creare un'istanza di un nuovo AbortableAsyncResult in seguito, assicurandosi di fornire l'argomento facoltativo di back-end se non si sta utilizzando lo default_backend.

abortable_async_result = AsyncBoot.apply_async(args=[name], name=name, connect_timeout=3) 
myTaskId = abortable_async_result.task_id 

tardi:

abortable_async_result = AbortableAsyncResult(myTaskId) 
abortable_async_result.abort() 
+1

Vale la pena notare che i documenti di sedici dicono: "questa classe funzionerà solo con i database backend". http://docs.celeryproject.org/en/latest/reference/celery.contrib.abortable.html?highlight=abort#celery.contrib.abortable – dgorissen

4

Hai visto la documentazione di riferimento? http://celeryq.org/docs/reference/celery.contrib.abortable.html

Per interrompere l'utilizzo compito result.abort():

>>> result = AsyncBoot.apply_async(...) 
>>> result.abort() 
+0

Ma come faccio ad avere oggetto risultato in un secondo momento, se tutto quello che ho è il task_id? Sto tentando di interrompere l'attività quando non ho più accesso all'oggetto risultato. Ho bisogno in qualche modo di estrarlo dal database. – Anon

+0

Sottaceti l'oggetto risultato nel database quindi – ionelmc

+0

'mytask.AsyncResult (task_id)' o 'da celery.result import AsyncResult; AsyncResult (task_id) '. – asksol

Problemi correlati