dco*_*296 84 python django message-passing celery
我一直在阅读文档和搜索,但似乎无法找到一个直接的答案:
你能取消已经执行的任务吗?(在任务开始时,需要一段时间,需要取消一半)
我在Celery FAQ的文档中找到了这个
>>> result = add.apply_async(args=[2, 2], countdown=120)
>>> result.revoke()
Run Code Online (Sandbox Code Playgroud)
但我不清楚这是否会取消排队的任务,或者它是否会杀死一个正在运行的进程.感谢您可以放下任何光线!
mhe*_*her 157
revoke取消任务执行.如果任务被撤销,则工作人员会忽略该任务而不执行该任务.如果不使用持久性撤销,则可以在工作人员重新启动后执行任务.
http://docs.celeryproject.org/en/latest/userguide/workers.html#worker-persistent-revokes
revoke有一个terminate选项,默认为False.如果需要终止执行任务,则需要将terminate设置为True.
>>> from celery.task.control import revoke
>>> revoke(task_id, terminate=True)
Run Code Online (Sandbox Code Playgroud)
http://docs.celeryproject.org/en/latest/userguide/workers.html#revoke-revoking-tasks
Roc*_*ite 32
根据Celery FAQ,你应该使用result.revoke:
>>> result = add.apply_async(args=[2, 2], countdown=120)
>>> result.revoke()
Run Code Online (Sandbox Code Playgroud)
或者如果您只有任务ID:
>>> from proj.celery import app
>>> app.control.revoke(task_id)
Run Code Online (Sandbox Code Playgroud)
kou*_*ouk 22
@ 0x00mh的答案是正确的,但是最近的芹菜文档说使用该terminate选项是" 管理员的最后手段 ",因为你可能会意外地终止同时开始执行的另一个任务.可能是一个更好的解决方案结合terminate=True使用signal='SIGUSR1'(这将导致SoftTimeLimitExceeded例外任务待提高).
小智 8
根据 5.2.3 文档,可以运行以下命令:
celery.control.revoke(task_id, terminate=True, signal='SIGKILL')
Run Code Online (Sandbox Code Playgroud)
在哪里
celery = Celery(app.name, broker=app.config['CELERY_BROKER_URL'])
小智 6
您可以使用代理和后端定义 celery 应用程序,例如:
from celery import Celery
celeryapp = Celery('app', broker=redis_uri, backend=redis_uri)
Run Code Online (Sandbox Code Playgroud)
当您运行发送任务时,它会返回任务的唯一 ID:
task_id = celeryapp.send_task('run.send_email', queue = "demo")
Run Code Online (Sandbox Code Playgroud)
要撤销任务,您需要 celery 应用程序和任务 ID:
celeryapp.control.revoke(task_id, terminate=True)
Run Code Online (Sandbox Code Playgroud)
小智 5
另外,不尽如人意的是,还有另一种方式(abort task)来停止任务,但也有很多不可靠的地方,更多详情参见: http ://docs.celeryproject.org/en/latest/reference/celery.contrib.abortable .html