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 11 Python
Python多线程中阻塞(join)与锁(Lock)使用误区解析
Apr 27 Python
python 编码规范整理
May 05 Python
pyQt4实现俄罗斯方块游戏
Jun 26 Python
Python中交换两个元素的实现方法
Jun 29 Python
Python实现基于KNN算法的笔迹识别功能详解
Jul 09 Python
使用tensorflow实现线性回归
Sep 08 Python
python学生信息管理系统(初级版)
Oct 17 Python
python实现LBP方法提取图像纹理特征实现分类的步骤
Jul 11 Python
python实现复制文件到指定目录
Oct 16 Python
Python基本语法之运算符功能与用法详解
Oct 22 Python
Python编程编写完善的命令行工具
Sep 15 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利用header函数实现文件下载时直接提示保存
2009/11/12 PHP
php+ajax实现无刷新数据分页的办法
2015/11/02 PHP
php mysql获取表字段名称和字段信息的三种方法
2016/11/13 PHP
PHP面向对象之工作单元(实例讲解)
2017/06/26 PHP
laravel框架关于搜索功能的实现
2018/03/15 PHP
jquery 日期分离成年月日的代码
2010/05/14 Javascript
解决Jquery load()加载GB2312页面时出现乱码的两种方案
2013/09/10 Javascript
JavaScript调用客户端的可执行文件(示例代码)
2013/11/28 Javascript
js判断页面中是否有指定控件的简单实例
2014/03/04 Javascript
原生的html元素选择器类似jquery选择器
2014/10/15 Javascript
Jquery树插件zTree用法入门教程
2015/02/17 Javascript
使用jQuery mobile库检测url绝对地址和相对地址的方法
2015/12/04 Javascript
jQuery选择器基础入门教程
2016/05/10 Javascript
浅析JavaScript中的对象类型Object
2016/05/26 Javascript
200行HTML+JavaScript实现年会抽奖程序
2019/01/22 Javascript
[46:12]完美世界DOTA2联赛循环赛 DM vs Matador BO2第一场 11.04
2020/11/04 DOTA
python人人网登录应用实例
2014/09/26 Python
python下读取公私钥做加解密实例详解
2017/03/29 Python
python环形单链表的约瑟夫问题详解
2018/09/27 Python
Python中shapefile转换geojson的示例
2019/01/03 Python
Django 表单模型选择框如何使用分组
2019/05/16 Python
使用python分析统计自己微信朋友的信息
2019/07/19 Python
django+echart数据动态显示的例子
2019/08/12 Python
Django 自定义404 500等错误页面的实现
2020/03/08 Python
基于Python和C++实现删除链表的节点
2020/07/06 Python
详解三种方式实现平滑滚动页面到顶部的功能
2019/04/23 HTML / CSS
入党自我评价优缺点
2014/01/25 职场文书
社区工作者感言
2014/03/02 职场文书
连带责任保证书
2014/04/29 职场文书
关于读书的演讲稿
2014/05/07 职场文书
美国旅游签证工作证明
2014/10/14 职场文书
大学生在校表现评语
2014/12/31 职场文书
客房服务员岗位职责
2015/02/09 职场文书
交通事故责任认定书
2015/08/06 职场文书
简短的人生哲理(38句)
2019/08/13 职场文书
三种方式清除vue路由跳转router-link的历史记录
2022/04/10 Vue.js