如何取消(终止)celery中正在运行的任务?已经尝试使用“AsyncResult(task_id).revoke(terminate=True)”,但它不起作用

问题描述 投票:0回答:2

在django项目中,我使用celery来运行异步任务。我想实现一个取消正在运行的任务的功能。

官方文档revoke:撤销任务说可以使用“revoke(terminate=True)”方法。我尝试过,但没有成功。 以下是我尝试过的一些方法:

...
task = AsyncResult("1e8fb3f3-4253-4bec-b71a-665ba5d23004")
print(task.state)
'STARTED'
task.revoke(terminate=True)
print(task.state)
'STARTED'
app.control.revoke("1e8fb3f3-4253-4bec-b71a-665ba5d23004", terminate=True)
print(task.state)
'STARTED'

最终它仍然执行完成。 有人遇到过类似的问题吗?或者还有其他方法可以满足我对芹菜的需求吗?任何帮助将不胜感激!

python python-3.x django
2个回答
0
投票

我在

Celery=5.3.0
中遇到了同样的问题,这个答案帮助我解决了它。它表示您应该根据结果撤销任务,例如:

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

0
投票

我对任何建议都没有运气,直到我在文档中读到了这个

如果您想在重新启动之间保留持久撤销列表 您需要使用以下命令指定要存储这些内容的文件 –statedb 对芹菜工人的争论

所以这意味着,当您运行与此类似的 celery 项目时:

celery -A app_name worker --beat

确保您使用文件来存储(文件夹需要存在并具有权限,对于我的项目来说,这工作正常,因为我有 staticfiles 文件夹,并且创建了worker.state 文件)

celery -A config worker --beat --statedb=staticfiles/worker.state

现在,调用此命令时所有任务都会被撤销

app.control.revoke(task_id)
© www.soinside.com 2019 - 2024. All rights reserved.