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实现获取某天是某个月中的第几周
Feb 11 Python
使用Python实现下载网易云音乐的高清MV
Mar 16 Python
Python的Django框架中的Context使用
Jul 15 Python
Python中的Descriptor描述符学习教程
Jun 02 Python
浅述python中argsort()函数的实例用法
Mar 30 Python
python中format()函数的简单使用教程
Mar 14 Python
python协程gevent案例 爬取斗鱼图片过程解析
Aug 27 Python
基于PyTorch的permute和reshape/view的区别介绍
Jun 18 Python
Django框架请求生命周期实现原理
Nov 13 Python
python 基于opencv 绘制图像轮廓
Dec 11 Python
Python操作PostgreSql数据库的方法(基本的增删改查)
Dec 29 Python
python安装mysql的依赖包mysql-python操作
Jan 01 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实现的mysqldb读写分离操作类示例
2017/02/07 PHP
thinkphp5 加载静态资源路径与常量的方法
2017/12/24 PHP
PHP后期静态绑定实例浅析
2018/12/21 PHP
JQuery的一些小应用收集
2010/03/27 Javascript
jQuery 锚点跳转滚动条平滑滚动一句话代码
2010/04/30 Javascript
JS动态添加与删除select中的Option对象(示例代码)
2013/12/25 Javascript
jquery操作checkbox示例分享
2014/07/21 Javascript
jQuery+PHP实现动态数字展示特效
2015/03/14 Javascript
Node.js和MongoDB实现简单日志分析系统
2015/04/25 Javascript
jQuery mobile转换url地址及获取url中目录部分的方法
2015/12/04 Javascript
JS实现回到页面顶部动画效果的简单实例
2016/05/24 Javascript
大型JavaScript应用程序架构设计模式
2016/06/29 Javascript
Javascript动画效果(4)
2016/10/11 Javascript
详解nodeJS之路径PATH模块
2017/05/31 NodeJs
20个必会的JavaScript面试题(小结)
2019/07/02 Javascript
[02:17]TI4西雅图DOTA2前线报道 啸天mik夫妻档解说
2014/07/08 DOTA
python获取局域网占带宽最大3个ip的方法
2015/07/09 Python
python 提取tuple类型值中json格式的key值方法
2018/12/31 Python
Python基础学习之时间转换函数用法详解
2019/06/18 Python
python 3.6.7实现端口扫描器
2019/09/04 Python
为什么说Python可以实现所有的算法
2019/10/04 Python
Pytorch使用MNIST数据集实现基础GAN和DCGAN详解
2020/01/10 Python
python实现实时视频流播放代码实例
2020/01/11 Python
python GUI库图形界面开发之PyQt5 Qt Designer工具(Qt设计师)详细使用方法及Designer ui文件转py文件方法
2020/02/26 Python
django 装饰器 检测登录状态操作
2020/07/02 Python
BASIC HOUSE官方旗舰店:韩国著名的服装品牌
2018/09/27 全球购物
简述Linux文件系统通过i节点把文件的逻辑结构和物理结构转换的工作过程
2016/01/06 面试题
电子信息科学专业自荐信
2014/01/30 职场文书
学校消防演习方案
2014/02/19 职场文书
餐饮业员工工作决心书
2014/03/11 职场文书
小学生十佳少年事迹材料
2014/08/20 职场文书
四风问题个人对照检查材料
2014/09/26 职场文书
2014财产信托协议书范本
2014/11/18 职场文书
2016年读书月活动总结范文
2016/04/06 职场文书
大学生饮品店创业计划书范文
2019/07/10 职场文书
公司要求试用期员工提交“述职报告”,该怎么写?
2019/07/17 职场文书