2010-08-26 236 views
6

我希望能够中止从Celery队列运行的任务(使用rabbitMQ)。我打电话给任务使用在django中取消Celery中的正在运行的任务

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

其中AsyncBoot是一个已定义的任务。

我可以得到任务ID(假设是apply_async返回的长字符串)并将其存储在数据库中,但我不确定如何调用中止方法。我看到如何使Abortable任务类放弃方法,但如果我只有任务ID字符串,该如何在任务上调用.abort()?谢谢。

回答

10

apply_async返回AsyncResult情况下,或者在这种情况下AbortableAsyncResult。保存task_id并使用它稍后实例化新的AbortableAsyncResult,如果不使用default_backend,请确保提供后端可选参数。

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

后来:

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

值得注意的是,芹菜文档说:“这个类只适用于数据库后端。” http://docs.celeryproject.org/en/latest/reference/celery.contrib.abortable.html?highlight=abort#celery.contrib.abortable – dgorissen 2011-11-08 17:03:08

4

您是否看到参考文档? http://celeryq.org/docs/reference/celery.contrib.abortable.html

要中止任务使用result.abort()

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

但我怎么在如果所有的我已经是TASK_ID日后得到结果对象?当我不再访问结果对象时,我试图中止任务。我需要把它从数据库中提取出来。 – Anon 2010-08-30 15:12:23

+0

Pickle数据库中的结果对象然后 – ionelmc 2011-10-17 22:30:50

+0

'mytask.AsyncResult(task_id)'或'from celery.result import AsyncResult; AsyncResult(TASK_ID)'。 – asksol 2011-10-19 18:27:03