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实现代理服务功能实例
Nov 15 Python
python通过线程实现定时器timer的方法
Mar 16 Python
python类中super()和__init__()的区别
Oct 18 Python
用python写一个windows下的定时关机脚本(推荐)
Mar 21 Python
R vs. Python 数据分析中谁与争锋?
Oct 18 Python
Django原生sql也能使用Paginator分页的示例代码
Nov 15 Python
Python实现获取前100组勾股数的方法示例
May 04 Python
解决Pycharm运行时找不到文件的问题
Oct 29 Python
Python代码打开本地.mp4格式文件的方法
Jan 03 Python
python元组和字典的内建函数实例详解
Oct 22 Python
使用Python开发个京东上抢口罩的小实例(仅作技术研究学习使用)
Mar 10 Python
Python生成九宫格图片的示例代码
Apr 14 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数据库差异比较的PHP代码
2012/02/05 PHP
PHP使用JSON和将json还原成数组
2015/02/12 PHP
php利用imagemagick实现复古老照片效果实例
2017/02/16 PHP
微信推送功能实现方式图文详解
2019/07/12 PHP
PHP copy函数使用案例代码解析
2020/09/01 PHP
前淘宝前端开发工程师阿当的PPT中有JS技术理念问题
2010/01/15 Javascript
利用JS重写Cognos右键菜单的实现代码
2010/04/11 Javascript
密码框显示提示文字jquery示例
2013/08/29 Javascript
jQuery学习笔记之toArray()
2014/06/09 Javascript
JavaScript 获取任一float型小数点后两位的小数
2014/06/30 Javascript
关于JavaScript的变量的数据类型的判断方法
2015/08/14 Javascript
jQuery实现的简单折叠菜单(折叠面板)效果代码
2015/09/16 Javascript
AngularJS实现分页显示数据库信息
2016/07/01 Javascript
详解如何在NodeJS项目中优雅的使用ES6
2017/04/22 NodeJs
关于Bootstrap按钮组件消除黄框的方法
2017/05/19 Javascript
一步步教你利用Canvas对图片进行处理
2017/09/19 Javascript
JavaScript数组的5种迭代方法
2017/09/29 Javascript
vue 修改 data 数据问题并实时显示的方法
2018/08/27 Javascript
解决vue打包后vendor.js文件过大问题
2019/07/03 Javascript
echarts统计x轴区间的数值实例代码详解
2019/07/07 Javascript
微信小程序实现时间戳格式转换
2020/07/20 Javascript
vue脚手架项目创建步骤详解
2021/03/02 Vue.js
[42:34]VP vs VG 2018国际邀请赛小组赛BO2 第一场 8.19
2018/08/21 DOTA
python通过socket查询whois的方法
2015/07/18 Python
Python使用pymysql小技巧
2017/06/04 Python
Python实现的查询mysql数据库并通过邮件发送信息功能
2018/05/17 Python
使用Python快速搭建HTTP服务和文件共享服务的实例讲解
2018/06/04 Python
Python实现括号匹配方法详解
2020/02/10 Python
利用CSS3的border-radius绘制太极及爱心图案示例
2016/05/17 HTML / CSS
浅析HTML5的WebSocket与服务器推送事件
2016/02/19 HTML / CSS
全球采购的街头服饰和帽子:Urban Excess
2020/10/28 全球购物
商铺门前三包责任书
2014/07/25 职场文书
党员干部群众路线个人整改措施
2014/09/18 职场文书
个人整改措施书面材料
2014/10/24 职场文书
通知的写法
2015/04/23 职场文书
董事长年会致辞
2015/07/29 职场文书