ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Celery+django如何显示任务的执行进度条

2021-04-05 11:52:22  阅读:221  来源: 互联网

标签:celery task 进度条 py django Celery sleep import progress


elery单词中文的意思是“芹菜”,也不知道为什么人家喜欢给起个菜名,实际从功能上跟芹菜一点也扯不上关系,非得往上靠难道国外吃芹菜是在后面吃?大家都知道,如果我们在后端执行一个时间比较长的任务,比如超过10分钟任务都没执行完,这个时候如果让用户在前端页面等待,那是非常恐怖的事情,比如用户点了个执行数据库备份的功能脚本,后台马上执行不完,前端用户就会一直等待,直到备份任务全部完成,天知道什么时候能完成,如果这个时候下班了,你走不走? 所以对一些比较耗时的任务,让用户在前端等待这个不可取,那怎么解决这些问题呢,这个呢,就用到我们刚才说的芹菜的功能了,celery是Python开发的分布式任务调度模块,你在前端执行的操作秒级返回给你结果,你还可以接着操作别的功能,至于你要执行的任务会由celery放到后端继续执行,等觉得差不多了,再看看最后执行结果,一切就是这么easy, 那这里还有一个细节问题,就是有的任务就是执行比较长,长的可能都让你怀疑是不是又出毛病了,当然对于专业开发人员,看看代码,看看数据库,也能分析出来,但对于其他只是使用平台的人就比较懵逼了,搞不好一顿骂娘,所以如果能把任务的进度按进度条的形式实时返给前端页面去展示,是不是突然有些高大上的感觉,那今天我们就来解决这个问题。


 说着简单,但要实现这个功能还是比较复杂的,不过呢,在python的世界一切都变得的容易起来了,我们今天就得介绍下这个celery-progress,有了它的基础,让你实现这个功能就变得容易的多了,首先,我们先来安装:

pip install celery-progress

接下来在settings.py文件INSTALLED_APPS中添加:

'celery_progress',

在settings.py文件中设置celery参数:

# CELERY settingCELERY_BROKER_URL = 'redis://127.0.0.1:6379'CELERY_ACCEPT_CONTENT = ['application/json']CELERY_TASK_SERIALIZER = 'json'

新建app:

python manage.py startapp celerybar

在celerybar 目录里新建urls.py,内容如下:

from django.urls import path, include
from .views import index
urlpatterns = [    path('', index, name='index'),
]

在项目的urls.py文件中增加:

 path('', include('celerybar.urls')), path('celery-progress/', include('celery_progress.urls')),

执行数据库迁移:

python manage.py makemigrationspytohn manage.py migrate

回到celerybar目录下,新建一个文件tasks.py,内容如下:

from celery import  shared_taskfrom time import sleepfrom celery_progress.backend import Progre***ecorder
@shared_task(bind=True)def go_to_sleep(self, duration):    progress_recorder = Progre***ecorder(self)    for i in range(100):        sleep(duration)        progress_recorder.set_progress(i + 1, 100, f'On iteration {i}')    sleep(duration)    return 'Done'
在这里,我们做演示功能,任务非常简单,就是sleep多少秒,这里说一下progress_recorder.set_progress参数,第一个是当时的进度,第二个是总进度,这里是100,对应range的100, 第三个参数是个描述,写完,我们打开views.py文件,内容如下:
from django.shortcuts import renderfrom .tasks import go_to_sleep
# Create your views here.
def index(request):    task = go_to_sleep.delay(1)    return render(request, 'celerybar/index.html', {'task_id': task.task_id})
这里导入tassk.py中的任务名称, 进行调用,delay就是放到后台进行执行。到这里后台的操作就算是完了,接下来我们看下index.html文件中的内容:
{% load static %}<!DOCTYPE html><html><head>    <meta charset="UTF-8">    <title>celery-progess</title></head><body><div>  <div id='progress-bar' style="background-color: #68a9ef; width: 0%;">&nbsp;</div></div><div id="progress-bar-message">Waiting for progress to start...</div>

<script src="{% static 'celery_progress/celery_progress.js' %}"></script><script>    // vanilla JS version    document.addEventListener("DOMContentLoaded", function () {        var progressUrl = "{% url 'celery_progress:task_status' task_id %}";        CeleryProgressBar.initProgressBar(progressUrl);    });</script></body></html>

启动运行结果如下:

图片

这样看起来是不是非常的爽了,再慢我们也不怕了,用户交互立马上了个档次,文章到此结束,感觉不错的小伙伴帮忙点亮再看和转发。


标签:celery,task,进度条,py,django,Celery,sleep,import,progress
来源: https://blog.51cto.com/15127521/2685575

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有