通过 Django 中的 celery Worker 停止当前正在运行的任务

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

我有一个 Django 应用程序和 React 作为我的前端框架,我使用 celery 来运行冗长的任务,这确实需要很多时间,但一切都工作正常。

我还通过 celery 信号和所有 .此外,我还创建了一个数据库表,用于存储所有正在运行的任务的状态,就像创建任务时一样,我使用参数创建一行,并且它们是唯一的,因此具有相同参数的任务如果已经运行则不会运行正在运行或正在队列中,因此用户界面良好。 但是很少有任务需要停止,并且用户有权停止正在运行的任务,因为我正在更新每个用户的任务。 现在,如果任务在队列中,我可以使用撤销来停止执行。

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

但问题是,我的任务非常冗长,因此用户可能想停止任务并专注于其他任务。

我想停止当前正在由工作人员运行的任务。 假设任务 T1 正在由工作人员执行,我想停止它,我已经看过互联网的每个部分,但找不到方法来做到这一点。

用户可能想要停止任务,我想向用户提供该功能以停止当前正在运行的任务。

我还查看了不同的任务管理模块,例如Dramatiq,但仍然无法停止当前的工作任务。我拥有停止任务的所有数据,例如任务 id 和 all ,但找不到方法来执行此操作。

任何帮助都会很棒。谢谢。

django celery django-celery celery-task
2个回答
1
投票

执行此操作的肮脏方法之一是向实际执行任务的子工作进程发送 SIGKILL。如果子进程被杀死,主工作进程将重生子进程并执行其他任务。

要发送信号,您必须从运行 celery 的服务器手动向 PID 发出 SIGKILL。你必须有一些其他进程(可能是 API)监听你的命令并发送 SIGKILL。


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.