我一直在阅读文档并进行搜索,但似乎找不到直接的答案:
您可以取消已经执行的任务吗?(由于任务已开始,需要一段时间,因此需要取消一半)
我在Celery FAQ的文档中找到了这个
>>> result = add.apply_async(args=[2, 2], countdown=120)
>>> result.revoke()
但是我不清楚这是否会取消排队的任务,或者是否会杀死工作程序上正在运行的进程。感谢您能摆脱的光芒!
我一直在阅读文档并进行搜索,但似乎找不到直接的答案:
您可以取消已经执行的任务吗?(由于任务已开始,需要一段时间,因此需要取消一半)
我在Celery FAQ的文档中找到了这个
>>> result = add.apply_async(args=[2, 2], countdown=120)
>>> result.revoke()
但是我不清楚这是否会取消排队的任务,或者是否会杀死工作程序上正在运行的进程。感谢您能摆脱的光芒!
Answers:
撤销将取消任务执行。如果任务被吊销,工人将忽略该任务并且不执行它。如果您不使用持久撤销,则可以在worker重新启动后执行您的任务。
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
根据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)
@ 0x00mh的答案是正确的,但是最近的celery 文档说使用该terminate
选项是“ 管理员的最后手段 ”,因为您可能不小心终止了同时开始执行的另一个任务。可能结合terminate=True
使用更好的解决方案signal='SIGUSR1'
(这将导致在任务中引发SoftTimeLimitExceeded异常)。
SoftTimeLimitExceeded
在任务中引发when时,将调用我的自定义清除逻辑(通过try
/ except
/ 实现finally
)。我认为,这要比AbortableTask
提供的服务更好(docs.celeryproject.org/en/latest/reference/…)。对于后者,您需要一个数据库结果后端,并且您必须手动并反复检查正在进行的任务的状态,以查看其是否已中止。
worker_prefetch_multiplier = 1
因为有几个长期运行的任务而使用了,则终止应该没问题-由于终止不会影响其他任务-我得到了正确的答案吗?@spicyramen
请参阅以下任务选项:time_limit,soft_time_limit(或者可以为worker设置它)。如果您不仅要控制执行时间,请参阅apply_async方法的expires参数。
此外,不能令人满意的还有另一种方法(终止任务)来停止任务,但是存在很多不可靠性,更多详细信息,请参见:http : //docs.celeryproject.org/en/latest/reference/celery.contrib.abortable .html