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获取网页状态码示例
Mar 30 Python
你所不知道的Python奇技淫巧13招【实用】
Dec 14 Python
python面向对象_详谈类的继承与方法的重载
Jun 07 Python
浅谈python 里面的单下划线与双下划线的区别
Dec 01 Python
python面向对象之类属性和类方法案例分析
Dec 30 Python
Tensorflow tf.nn.atrous_conv2d如何实现空洞卷积的
Apr 20 Python
解决numpy矩阵相减出现的负值自动转正值的问题
Jun 03 Python
在keras中对单一输入图像进行预测并返回预测结果操作
Jul 09 Python
了解一下python内建模块collections
Sep 07 Python
python如何实时获取tcpdump输出
Sep 16 Python
基于Python实现天天酷跑功能
Jan 06 Python
Python之matplotlib绘制折线图
Apr 13 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
Yii2框架中使用PHPExcel导出Excel文件的示例
2017/08/09 PHP
Yii框架通过请求组件处理get,post请求的方法分析
2019/09/03 PHP
js压缩利器
2007/02/20 Javascript
javascript异步处理工作机制详解
2015/04/13 Javascript
javascript经典特效分享 手风琴、轮播图、图片滑动
2016/09/14 Javascript
js获取当前周、上一周、下一周日期
2017/03/19 Javascript
微信小程序实现滑动删除效果
2017/05/19 Javascript
jQuery扇形定时器插件pietimer使用方法详解
2017/07/18 jQuery
vue 怎么创建组件及组件使用方法
2017/07/27 Javascript
vue中引入第三方字体文件的方法示例
2018/12/17 Javascript
JavaScript中关于base64的一些事
2019/05/06 Javascript
从零开始用webpack构建一个vue3.0项目工程的实现
2020/09/24 Javascript
[02:41]DOTA2英雄基础教程 亚巴顿
2014/01/02 DOTA
[57:53]Secret vs Pain 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/20 DOTA
python 将字符串转换成字典dict
2013/03/24 Python
一个检测OpenSSL心脏出血漏洞的Python脚本分享
2014/04/10 Python
详解如何在Apache中运行Python WSGI应用
2019/01/02 Python
pandas数据处理进阶详解
2019/10/11 Python
Python requests获取网页常用方法解析
2020/02/20 Python
Python Selenium模块安装使用教程详解
2020/07/09 Python
AmazeUI 折叠面板的实现代码
2020/08/17 HTML / CSS
Sandro Paris美国官网:典雅别致的法国时尚服饰品牌
2017/12/26 全球购物
吉列剃须刀美国官网:Gillette美国
2018/07/13 全球购物
韩国美国时尚服装和美容在线全球市场:KOODING
2018/11/07 全球购物
Loreto Gallo英国:欧洲领先的在线药房
2021/01/21 全球购物
触摸春天教学反思
2014/02/03 职场文书
中介公司区域经理岗位职责范本
2014/03/02 职场文书
财产公证书
2014/04/10 职场文书
推荐信模板
2014/05/09 职场文书
2014党委书记四风对照检查材料思想汇报
2014/09/21 职场文书
标准单位租车协议书
2014/09/23 职场文书
领导干部“四风”问题批评与自我批评材料
2014/09/24 职场文书
2015廉洁自律个人总结
2015/02/14 职场文书
货款欠条范本
2015/07/03 职场文书
python 下载文件的几种方式分享
2021/04/07 Python
python基础详解之if循环语句
2021/04/24 Python