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 相关文章推荐
python实现上传样本到virustotal并查询扫描信息的方法
Oct 05 Python
python通过字典dict判断指定键值是否存在的方法
Mar 21 Python
python strip() 函数和 split() 函数的详解及实例
Feb 03 Python
解决python中用matplotlib画多幅图时出现图形部分重叠的问题
Jul 07 Python
Django REST Framework序列化外键获取外键的值方法
Jul 26 Python
python3调用windows dos命令的例子
Aug 14 Python
Python3 sys.argv[ ]用法详解
Oct 24 Python
Python+OpenCV实现旋转文本校正方式
Jan 09 Python
浅谈python中频繁的print到底能浪费多长时间
Feb 21 Python
python 带时区的日期格式化操作
Oct 23 Python
selenium+python实现基本自动化测试的示例代码
Jan 27 Python
Python办公自动化之教你如何用Python将任意文件转为PDF格式
Jun 28 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
PHP中的session永不过期的解决思路及实现方法分享
2011/04/20 PHP
PHP中基于ts与nts版本- vc6和vc9编译版本的区别详解
2013/04/26 PHP
php在window iis的莫名问题的测试方法
2013/05/14 PHP
PHP 获取文件权限函数介绍
2013/07/11 PHP
Ubuntu彻底删除PHP7.0的方法
2018/07/27 PHP
PHP7 标准库修改
2021/03/09 PHP
javascript 面向对象编程 聊聊对象的事
2009/09/17 Javascript
iframe的onload在Chrome/Opera中执行两次Bug的解决方法
2011/03/17 Javascript
JQuery中如何传递参数如click(),change()等具体实现
2013/04/28 Javascript
jQuery lazyLoad图片延迟加载插件的优化改造方法分享
2013/08/13 Javascript
实用框架(iframe)操作代码
2014/10/23 Javascript
Javascript学习笔记之函数篇(五) : 构造函数
2014/11/23 Javascript
jQuery mobile 移动web(6)
2015/12/20 Javascript
深入剖析JavaScript:Object类型
2016/05/10 Javascript
jQuery表单设置值的方法
2017/06/30 jQuery
利用ECharts.js画K线图的方法示例
2018/01/10 Javascript
Vue2.0实现组件数据的双向绑定问题
2018/03/06 Javascript
微信小程序input框中加入小图标的实现方法
2018/06/19 Javascript
基于Cesium绘制抛物弧线
2020/11/18 Javascript
Python中工作日类库Busines Holiday的介绍与使用
2017/07/06 Python
用python实现的线程池实例代码
2018/01/06 Python
python 集合 并集、交集 Series list set 转换的实例
2018/05/29 Python
tensorflow实现简单逻辑回归
2018/09/07 Python
python 接收处理外带的参数方法
2018/12/03 Python
python中图像通道分离与合并实例
2020/01/17 Python
Python读写操作csv和excle文件代码实例
2020/03/16 Python
CSS3 RGBA色彩模式使用实例讲解
2016/04/26 HTML / CSS
优衣库英国官网:UNIQLO英国
2016/12/25 全球购物
军训教官感言
2014/03/02 职场文书
《花木兰》教学反思
2014/04/09 职场文书
人身损害赔偿协议书格式
2014/11/01 职场文书
学困生帮扶工作总结
2015/08/13 职场文书
canvas实现贪食蛇的实践
2022/02/15 Javascript
win11无线投屏在哪设置? win11无线投屏功能的使用方法
2022/04/08 数码科技
详细介绍python操作RabbitMq
2022/04/12 Python
python数字图像处理数据类型及颜色空间转换
2022/06/28 Python