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中使用mysql数据库详细介绍
Mar 27 Python
Python数据结构与算法之图的最短路径(Dijkstra算法)完整实例
Dec 12 Python
python画折线图的程序
Jul 26 Python
使用python采集脚本之家电子书资源并自动下载到本地的实例脚本
Oct 23 Python
使用pandas实现csv/excel sheet互相转换的方法
Dec 10 Python
python控制nao机器人身体动作实例详解
Apr 29 Python
在Pycharm中使用GitHub的方法步骤
Jun 13 Python
python进程池实现的多进程文件夹copy器完整示例
Nov 27 Python
python不使用for计算两组、多个矩形两两间的iou方式
Jan 18 Python
Django User 模块之 AbstractUser 扩展详解
Mar 11 Python
Python爬虫基于lxml解决数据编码乱码问题
Jul 31 Python
python使用smtplib模块发送邮件
Dec 17 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和JavaScript判断请求是否来自微信内浏览器
2015/08/18 PHP
PHP简单实现无限级分类的方法
2016/05/13 PHP
Yii2中Restful API原理实例分析
2016/07/25 PHP
Yii2创建多界面主题(Theme)的方法
2016/10/08 PHP
javascript在事件监听方面的兼容性小结
2010/04/07 Javascript
js操纵dom生成下拉列表框的方法
2014/02/24 Javascript
jQuery循环动画与获取组件尺寸的方法
2015/02/02 Javascript
JS实现跟随鼠标闪烁转动色块的方法
2015/02/26 Javascript
JQuery核心函数是什么及使用方法介绍
2016/05/03 Javascript
JavaScript实现九九乘法表的简单实例
2016/06/07 Javascript
Javascript中arguments对象的详解与使用方法
2016/10/04 Javascript
vue实现点击选中,其他的不选中方法
2018/09/05 Javascript
用npm-run实现自动化任务的方法示例
2019/01/14 Javascript
微信小程序获取用户绑定手机号方法示例
2019/07/21 Javascript
vue递归组件实战之简单树形控件实例代码
2019/08/27 Javascript
vue 重塑数组之修改数组指定index的值操作
2020/08/09 Javascript
[03:59]5分钟带你了解什么是DOTA2(第二期)
2017/02/07 DOTA
python操作ssh实现服务器日志下载的方法
2015/06/03 Python
正确理解python中的关键字“with”与上下文管理器
2017/04/21 Python
Python使用Selenium+BeautifulSoup爬取淘宝搜索页
2018/02/24 Python
Python模拟自动存取款机的查询、存取款、修改密码等操作
2018/09/02 Python
在PyCharm下使用 ipython 交互式编程的方法
2019/01/17 Python
Python操作Jira库常用方法解析
2020/04/10 Python
Python字符串对齐、删除字符串不需要的内容以及格式化打印字符
2021/01/23 Python
css3气泡 css3关键帧动画创建的动态通知气泡
2013/02/26 HTML / CSS
HTML5边玩边学(3)像素和颜色
2010/09/21 HTML / CSS
啤酒销售实习自我鉴定
2013/09/24 职场文书
生物技术研究生自荐信
2013/11/12 职场文书
初三物理教学反思
2014/01/21 职场文书
晚会主持词开场白
2014/03/17 职场文书
吃空饷专项整治方案
2014/10/27 职场文书
英语感谢信范文
2015/01/20 职场文书
2015年助理政工师工作总结
2015/05/26 职场文书
Vue.js 带下拉选项的输入框(Textbox with Dropdown)组件
2021/04/17 Vue.js
python3+PyQt5+Qt Designer实现界面可视化
2021/06/10 Python
Python安装及建立虚拟环境的完整步骤
2022/06/25 Servers