我一直在阅读文档和搜索,但似乎无法找到一个直接的答案:
你可以取消已执行的任务吗? (在任务开始时,需要一段时间,需要取消一半)
我是在Celery FAQ
的文档中找到的>>> result = add.apply_async(args=[2, 2], countdown=120)
>>> result.revoke()
但是我不清楚这是否会取消排队的任务,或者它是否会杀死一个正在运行的进程。谢谢你能放下任何光线!
答案 0 :(得分:148)
撤销取消任务执行。如果任务被撤销,则工作人员会忽略该任务而不执行该任务。如果不使用持久性撤销,则可以在工作人员重新启动后执行任务。
http://docs.celeryproject.org/en/latest/userguide/workers.html#worker-persistent-revokes
revoke默认有一个终止选项 False 。如果您需要终止正在执行的任务,则需要将终止设置为 True 。
>>> from celery.task.control import revoke
>>> revoke(task_id, terminate=True)
http://docs.celeryproject.org/en/latest/userguide/workers.html#revoke-revoking-tasks
答案 1 :(得分:31)
在Celery 3.1中,API of revoking tasks已更改。
根据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)
答案 2 :(得分:18)
@ 0x00mh的答案是正确的,但是最近的芹菜docs说使用terminate
选项是“管理员的最后手段”,因为你可能会意外地终止另一个任务在此期间开始执行。可能更好的解决方案是将terminate=True
与signal='SIGUSR1'
相结合(这会导致在任务中引发SoftTimeLimitExceeded异常)。
答案 3 :(得分:1)
请参阅以下任务选项:time_limit,soft_time_limit(或者您可以为工作人员设置)。如果您不仅要控制执行时间,请参阅apply_async方法的expires参数。
答案 4 :(得分:0)
此外,还不能令人满意,还有另一种方法(中止任务)来停止任务,但是存在许多不可靠性,更多详细信息,请参见: http://docs.celeryproject.org/en/latest/reference/celery.contrib.abortable.html