Python Flask实现进度条


Posted in Python onMay 11, 2022

使用Flask实现进度条

问题描述

Python异步处理,新起一个进程返回处理进度

解决方案

使用 tqdm 和 multiprocessing.Pool

安装

pip install tqdm

代码

import time
import threading
from multiprocessing import Pool
from tqdm import tqdm
def do_work(x):
    time.sleep(x)
    return x
def progress():
    time.sleep(3)  # 3秒后查进度
    print(f'任务有: {pbar.total} 已完成:{pbar.n}')
tasks = range(10)
pbar = tqdm(total=len(tasks))
if __name__ == '__main__':
    thread = threading.Thread(target=progress)
    thread.start()
    results = []
    with Pool(processes=5) as pool:
        for result in pool.imap_unordered(do_work, tasks):
            results.append(result)
            pbar.update(1)
    print(results)

效果

Python Flask实现进度条

Flask

安装

pip install flask

main.py

import time
from multiprocessing import Pool
from tqdm import tqdm
from flask import Flask, make_response, jsonify
app = Flask(__name__)
def do_work(x):
    time.sleep(x)
    return x
total = 5  # 总任务数
tasks = range(total)
pbar = tqdm(total=len(tasks))
@app.route('/run/')
def run():
    """执行任务"""
    results = []
    with Pool(processes=2) as pool:
        for _result in pool.imap_unordered(do_work, tasks):
            results.append(_result)
            if pbar.n >= total:
                pbar.n = 0  # 重置
            pbar.update(1)
    response = make_response(jsonify(dict(results=results)))
    response.headers.add('Access-Control-Allow-Origin', '*')
    response.headers.add('Access-Control-Allow-Headers', '*')
    response.headers.add('Access-Control-Allow-Methods', '*')
    return response
@app.route('/progress/')
def progress():
    """查看进度"""
    response = make_response(jsonify(dict(n=pbar.n, total=pbar.total)))
    response.headers.add('Access-Control-Allow-Origin', '*')
    response.headers.add('Access-Control-Allow-Headers', '*')
    response.headers.add('Access-Control-Allow-Methods', '*')
    return response

启动(以 Windows 为例)

set FLASK_APP=main
flask run

接口列表

  • 执行任务:http://127.0.0.1:5000/run/
  • 查看进度:http://127.0.0.1:5000/progress/

test.html

<!DOCTYPE html>
<html lang="zh">
<head>
    <meta charset="UTF-8">
    <title>进度条</title>
    <script src="https://cdn.bootcss.com/jquery/3.0.0/jquery.min.js"></script>
    <script src="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/3.3.7/js/bootstrap.min.js"></script>
    <link href="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/3.3.7/css/bootstrap.min.css" rel="external nofollow"  rel="stylesheet">
</head>
<body>
<button id="run">执行任务</button>
<br><br>
<div class="progress">
    <div class="progress-bar" role="progressbar" aria-valuenow="1" aria-valuemin="0" aria-valuemax="100"
         style="width: 10%">0.00%
    </div>
</div>
</body>
<script>
    function set_progress_rate(n, total) {
        //设置进度
        var rate = (n / total * 100).toFixed(2);
        if (n > 0) {
            $(".progress-bar").attr("aria-valuenow", n);
            $(".progress-bar").attr("aria-valuemax", total);
            $(".progress-bar").text(rate + "%");
            $(".progress-bar").css("width", rate + "%");
        }
    }
    $("#run").click(function () {
        //执行任务
        $.ajax({
            url: "http://127.0.0.1:5000/run/",
            type: "GET",
            success: function (response) {
                set_progress_rate(100, 100);
                console.log('执行完成,结果为:' + response['results']);
            }
        });
    });
    setInterval(function () {
        //每1秒请求一次进度
        $.ajax({
            url: "http://127.0.0.1:5000/progress/",
            type: "GET",
            success: function (response) {
                console.log(response);
                var n = response["n"];
                var total = response["total"];
                set_progress_rate(n, total);
            }
        });
    }, 1000);
</script>
</html>

效果

Python Flask实现进度条

Flask使用简单异步任务

在Flask中使用简单异步任务最简洁优雅的原生实现:

from flask import Flask
from time import sleep
from concurrent.futures import ThreadPoolExecutor
# DOCS https://docs.python.org/3/library/concurrent.futures.html#concurrent.futures.ThreadPoolExecutor
executor = ThreadPoolExecutor(2)
app = Flask(__name__)
@app.route('/jobs')
def run_jobs():
    executor.submit(some_long_task1)
    executor.submit(some_long_task2, 'hello', 123)
    return 'Two jobs was launched in background!'
def some_long_task1():
    print("Task #1 started!")
    sleep(10)
    print("Task #1 is done!")
def some_long_task2(arg1, arg2):
    print("Task #2 started with args: %s %s!" % (arg1, arg2))
    sleep(5)
    print("Task #2 is done!")
if __name__ == '__main__':
    app.run()

Tags in this post...

Python 相关文章推荐
在Django的视图中使用数据库查询的方法
Jul 16 Python
简单解决Python文件中文编码问题
Nov 22 Python
分享Python字符串关键点
Dec 13 Python
Pandas之drop_duplicates:去除重复项方法
Apr 18 Python
python实现决策树ID3算法的示例代码
May 30 Python
django2用iframe标签完成网页内嵌播放b站视频功能
Jun 20 Python
Python抽象和自定义类定义与用法示例
Aug 23 Python
简单了解django orm中介模型
Jul 30 Python
Python 异常处理Ⅳ过程图解
Oct 18 Python
Python统计文本词汇出现次数的实例代码
Feb 27 Python
python3实现将json对象存入Redis以及数据的导入导出
Jul 16 Python
Python如何将模块打包并发布
Aug 30 Python
Python PIL按比例裁剪图片
May 11 #Python
python 学习GCN图卷积神经网络
May 11 #Python
Python+Pillow+Pytesseract实现验证码识别
May 11 #Python
Python 绘制多因子柱状图
PyCharm 配置SSH和SFTP连接远程服务器
May 11 #Python
Python 文字识别
May 11 #Python
解决Python保存文件名太长OSError: [Errno 36] File name too long
May 11 #Python
You might like
MySQL授权问题总结
2007/05/06 PHP
php中实现记住密码自动登录的代码
2011/03/02 PHP
浅析使用Turck-mmcache编译来加速、优化PHP代码
2013/06/20 PHP
laravel5.2实现区分前后台用户登录的方法
2017/01/11 PHP
php中目录操作opendir()、readdir()及scandir()用法示例
2019/06/08 PHP
Thinkphp5.0框架使用模型Model的获取器、修改器、软删除数据操作示例
2019/10/11 PHP
下载站控制介绍字数显示的脚本 显示全部 隐藏介绍等功能
2009/09/19 Javascript
javascript模拟地球旋转效果代码实例
2013/12/02 Javascript
jquery对ajax的支持介绍
2013/12/10 Javascript
解决html按钮切换绑定不同函数后点击时执行多次函数问题
2014/05/14 Javascript
jquery实现Slide Out Navigation滑出式菜单效果代码
2015/09/07 Javascript
AngularJS 获取ng-repeat动态生成的ng-model值实例详解
2016/11/29 Javascript
Bootstrap表单使用方法详解
2017/02/17 Javascript
详解Vue 实例中的生命周期钩子
2017/03/21 Javascript
node.js实现登录注册页面
2017/04/08 Javascript
利用 spin.js 生成等待效果(js 等待效果)
2017/06/25 Javascript
vue.js组件之间传递数据的方法
2017/07/10 Javascript
vue router仿天猫底部导航栏功能
2017/10/18 Javascript
JS实现十字坐标跟随鼠标效果
2017/12/25 Javascript
jQuery发请求传输中文参数乱码问题的解决方案
2018/05/22 jQuery
详解Vue CLI 3.0脚手架如何mock数据
2018/11/23 Javascript
vue实现分环境打包步骤(给不同的环境配置相对应的打包命令)
2019/06/04 Javascript
javascript将扁平的数据转为树形结构的高效率算法
2020/02/27 Javascript
vue+vant使用图片预览功能ImagePreview的问题解决
2020/04/10 Javascript
Javascript异步流程控制之串行执行详解
2020/09/27 Javascript
[08:44]和酒神一起战斗 DOTA2教你做大人
2014/03/27 DOTA
[01:00:06]加油DOTA_EP01_网络版
2014/08/09 DOTA
python处理json数据中的中文
2014/03/06 Python
Python实现批量将word转html并将html内容发布至网站的方法
2015/07/14 Python
15行Python代码带你轻松理解令牌桶算法
2018/03/21 Python
python读取图片任意范围区域
2019/01/23 Python
pycharm无法导入本地模块的解决方式
2020/02/12 Python
python与c语言的语法有哪些不一样的
2020/09/13 Python
英国优质鞋类专家:Robinson’s Shoes
2017/12/08 全球购物
自定义函数实现单词排序并运用于PostgreSQL(实现代码)
2021/04/22 PostgreSQL
为什么MySQL 删除表数据 磁盘空间还一直被占用
2021/10/16 MySQL