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 10 Python
在Python中使用异步Socket编程性能测试
Jun 25 Python
Python的Flask框架的简介和安装方法
Nov 13 Python
python清除字符串中间空格的实例讲解
May 11 Python
使用python根据端口号关闭进程的方法
Nov 06 Python
python 实现在tkinter中动态显示label图片的方法
Jun 13 Python
Python实现微信翻译机器人的方法
Aug 13 Python
Python3 合并二叉树的实现
Sep 30 Python
python matplotlib实现将图例放在图外
Apr 17 Python
python对接ihuyi实现短信验证码发送
May 10 Python
简单了解Python多态与属性运行原理
Jun 15 Python
python 贪心算法的实现
Sep 18 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之第二天
2006/10/09 PHP
PHP后台微信支付和支付宝支付开发
2017/04/28 PHP
php微信支付之公众号支付功能
2018/05/30 PHP
Yii-自定义删除确认弹框(zyd)jquery实现代码
2013/03/04 Javascript
js中符号转意问题示例探讨
2013/08/19 Javascript
js实现兼容性好的微软官网导航下拉菜单效果
2015/09/07 Javascript
JavaScript如何动态创建table表格
2020/08/02 Javascript
浅谈javascript:两种注释,声明变量,定义函数
2016/10/05 Javascript
微信小程序 页面跳转和数据传递实例详解
2017/01/19 Javascript
js断点调试心得分享(必看篇)
2017/12/08 Javascript
Vue.js+Layer表格数据绑定与实现更新的实例
2018/03/07 Javascript
用vue写一个仿简书的轮播图的示例代码
2018/03/13 Javascript
React Native日期时间选择组件的示例代码
2018/04/27 Javascript
解决Angular2 router.navigate刷新页面的问题
2018/08/31 Javascript
微信小程序购物车、父子组件传值及calc的注意事项总结
2018/11/14 Javascript
angular 实现下拉列表组件的示例代码
2019/03/09 Javascript
kafka调试中遇到Connection to node -1 could not be established. Broker may not be available.
2019/09/17 Javascript
javascript设计模式 ? 迭代器模式原理与用法实例分析
2020/04/17 Javascript
在Python中使用base64模块处理字符编码的教程
2015/04/28 Python
详解python3实现的web端json通信协议
2016/12/29 Python
对python当中不在本路径的py文件的引用详解
2018/12/15 Python
pytorch:实现简单的GAN示例(MNIST数据集)
2020/01/10 Python
如何使用python传入不确定个数参数
2020/02/18 Python
HTML5新控件之日期和时间选择输入的实现代码
2018/09/13 HTML / CSS
HTML5之多线程(Web Worker)
2019/01/02 HTML / CSS
canvas 绘图时位置偏离的问题解决
2020/09/16 HTML / CSS
欧洲最大的拼图游戏商店:JigsawPuzzle.co.uk
2018/07/04 全球购物
世界各地的当地人的食物体验:Eatwith
2019/07/26 全球购物
煤矿安全协议书
2014/08/20 职场文书
大学生作弊检讨书
2014/09/11 职场文书
学习三严三实心得体会
2014/10/13 职场文书
2014年卫生监督工作总结
2014/12/09 职场文书
建国大业电影观后感
2015/06/01 职场文书
哈姆雷特读书笔记
2015/06/29 职场文书
JavaScript选择器函数querySelector和querySelectorAll
2021/11/27 Javascript
Win11安装升级时提示“该电脑必须支持安全启动”
2022/04/19 数码科技