112

我一直在阅读文档并进行搜索,但似乎找不到直接的答案:

你可以取消已经执行的任务吗?(因为任务已经开始,需要一段时间,中途需要取消)

我从Celery FAQ的文档中找到了这个

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

但我不清楚这是否会取消排队的任务,或者它是否会杀死工作人员上正在运行的进程。感谢您提供的任何光线!

4

6 回答 6

209

revoke取消任务执行。如果任务被撤销,工作人员会忽略该任务并且不执行它。如果您不使用持久撤销,您的任务可以在工作人员重新启动后执行。

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

revoke 有一个终止选项,默认为False。如果您需要终止正在执行的任务,则需要将 terminate 设置为True

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

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

于 2012-01-19T10:02:45.857 回答
49

在 Celery 3.1 中,撤销任务的 API发生了变化。

根据Celery FAQ,您应该使用 result.revoke:

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

或者如果您只有任务 ID:

>>> from proj.celery import app
>>> app.control.revoke(task_id)
于 2014-08-29T03:44:43.497 回答
33

@0x00mh 的答案是正确的,但是最近的 celery文档说使用该terminate选项是“管理员的最后手段”,因为您可能会意外终止同时开始执行的另一个任务。可能更好的解决方案是结合terminate=True使用signal='SIGUSR1'(这会导致在任务中引发 SoftTimeLimitExceeded 异常)。

于 2015-04-14T12:38:54.793 回答
2

请参阅以下任务选项:time_limitsoft_time_limit(或者您可以为工人设置它)。如果您不仅想控制执行时间,请参阅apply_async 方法的expires参数。

于 2012-01-19T06:40:55.000 回答
2

另外,不尽人意,还有另一种方式(abort task)可以停止任务,但是有很多不可靠的地方,更多细节见: http ://docs.celeryproject.org/en/latest/reference/celery.contrib.abortable .html

于 2018-12-06T06:29:35.593 回答
0
from celery.app import default_app

revoked = default_app.control.revoke(task_id, terminated=True, signal='SIGKILL')
print(revoked)
于 2022-02-20T15:35:21.770 回答