如何从 django 模板暂停和停止 celery 任务

Posted

技术标签:

【中文标题】如何从 django 模板暂停和停止 celery 任务【英文标题】:How to pause and stop celery task from django template 【发布时间】:2020-12-25 00:03:21 【问题描述】:

我正在开发一个使用 celery 异步运行任务的 django 应用程序。现在,用户可以从网页提交表单来启动 celery 任务。但是没有办法通过单击 django 模板中的按钮来暂停或停止任务。

这是我目前的代码

芹菜任务

@shared_task
def get_website(website):
    website_list = return_website_list(website)

    return website_list

在上述任务中,我调用了一个 return_website_list() 函数,该函数会抓取所需的网站并返回该网站的链接列表。

output.html 模板

<div class="container">
    <button class="pause_btn" type="button">Pause task</button>
    <button class="resume_btn" type="button">Resume task</button>
    <button class="stop_btn" type="button">Stop task</button>
</div>

我希望能够在单击暂停按钮时无限期暂停任务,并在单击恢复按钮时恢复任务,或者能够在单击停止按钮时完全停止任务。

views.py

def index(request):

    if request.method == 'POST':
        website = request.POST.get('website-name')
   
        get_website.delay(website)
        return redirect('output')

    return render(request, 'index.html')

我在网上搜索过这些link1、link2、link3。但是这些链接并没有帮助我实现我想要做的事情。

提前致谢

【问题讨论】:

afaik,Celery 中没有内置 API。此外,您可能需要某种 自定义逻辑 来获得 PAUSE 功能,因为 Django/Celery/Redis(或任何其他代理)赢了'无法知道每个任务的最后一个执行点在哪里 顺便说一句,您可以终止(又名停止)任务,比暂停更容易。参考:Cancel an already executing task with Celery? 我最近为一个类似的问题给出了这个答案 - “如何从基于 Django 的站点管理任务的停止或重新启动?”:***.com/a/62809499/2785080 您可以轻松地调整它以满足您的使用需求。如果您需要进一步解释,请告诉我。 @Ben 我看到了你的回答。如何恢复使用您的逻辑部分执行的任务? @Ben 你好!谢谢回复。在您的回答中,您创建了一个模型ScriptTracker() 对吗?你能解释一下我会将while 循环放在哪里吗?对不起,我仍然是 django 和 celery 的新手,真的很想你帮忙 【参考方案1】:

我的想法是一个名为 state 的字段,state 将从暂停按钮单击中设置。并且在每个动作检查状态的 celery 任务中,如果它处于暂停状态,请等待 1 秒并再次检查。我以前用这个想法来取消操作

【讨论】:

以上是关于如何从 django 模板暂停和停止 celery 任务的主要内容,如果未能解决你的问题,请参考以下文章

Django / Celery中的哨兵登录停止工作

停止 Redis 后如何继续执行 celery 队列,然后再启动它?

Celery Crontab 中的输出日期调度到 Django 模板

如何停止芹菜工人进程

如何使用 Django 配置 Celery 守护进程

我们如何在 django 中创建异步 API?