【发布时间】: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 的站点管理任务的停止或重新启动?”:stackoverflow.com/a/62809499/2785080 您可以轻松地调整它以满足您的使用需求。如果您需要进一步解释,请告诉我。
-
@Ben 我看到了你的回答。如何恢复使用您的逻辑部分执行的任务?
-
@Ben 你好!谢谢回复。在您的回答中,您创建了一个模型
ScriptTracker()对吗?你能解释一下我会将while循环放在哪里吗?对不起,我仍然是 django 和 celery 的新手,真的很想你帮忙
标签: python django celery celery-task