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+django实现文件上传
Jan 17 Python
举例讲解Python的lambda语句声明匿名函数的用法
Jul 01 Python
python+opencv实现动态物体识别
Jan 09 Python
Python模拟随机游走图形效果示例
Feb 06 Python
用pandas按列合并两个文件的实例
Apr 12 Python
Linux下python与C++使用dlib实现人脸检测
Jun 29 Python
wxPython多个窗口的基本结构
Nov 19 Python
Pandas+Matplotlib 箱式图异常值分析示例
Dec 09 Python
Python解析多帧dicom数据详解
Jan 13 Python
python自动提取文本中的时间(包含中文日期)
Aug 31 Python
基于python判断字符串括号是否闭合{}[]()
Sep 21 Python
python中的split、rsplit、splitlines用法说明
Oct 23 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下一个阿拉伯数字转中文数字的函数
2007/07/16 PHP
坏狼php学习 计数器实例代码
2008/06/15 PHP
jQuery封装的获取Url中的Get参数示例
2013/11/26 Javascript
jquery form表单序列化为对象的示例代码
2014/03/05 Javascript
JQuery 控制内容长度超出规定长度显示省略号
2014/05/23 Javascript
通过Jquery的Ajax方法读取将table转换为Json
2014/05/31 Javascript
jquery合并表格中相同文本的相邻单元格
2015/07/17 Javascript
JQuery实现DIV其他动画效果的简单实例
2016/09/18 Javascript
AngularJS extend用法详解及实例代码
2016/11/15 Javascript
如何判断出一个js对象是否一个dom对象
2016/11/24 Javascript
JavaScript中英文字符长度统计方法示例【按照中文占2个字符】
2017/01/17 Javascript
jQuery EasyUI Draggable拖动组件
2017/03/01 Javascript
Vue学习之路之登录注册实例代码
2017/07/06 Javascript
基于JavaScript实现弹幕特效
2020/08/27 Javascript
bootstrap select下拉搜索插件使用方法详解
2017/11/23 Javascript
Node层模拟实现multipart表单的文件上传示例
2018/01/02 Javascript
vue实现循环滚动列表
2020/06/30 Javascript
在Vue中使用Viser说明(基于AntV-G2可视化引擎)
2020/10/28 Javascript
[01:20:06]TNC vs VG 2018国际邀请赛小组赛BO2 第二场 8.16
2018/08/17 DOTA
Python中关于字符串对象的一些基础知识
2015/04/08 Python
Python抽象类的新写法
2015/06/18 Python
利用python模拟实现POST请求提交图片的方法
2017/07/25 Python
Python常见字典内建函数用法示例
2018/05/14 Python
Python并发:多线程与多进程的详解
2019/01/24 Python
Python socket模块ftp传输文件过程解析
2019/11/05 Python
Python Tornado之跨域请求与Options请求方式
2020/03/28 Python
Python pandas对excel的操作实现示例
2020/07/21 Python
Django中日期时间型字段进行年月日时分秒分组统计
2020/11/27 Python
俄罗斯玩具、儿童用品、儿童服装和鞋子网上商店:MyToys.ru
2019/10/14 全球购物
预备党员思想汇报范文
2013/12/29 职场文书
竞选班干部演讲稿
2014/04/24 职场文书
酒店服务员岗位职责
2015/02/09 职场文书
2015年简历自我评价范文
2015/03/11 职场文书
大学生实习推荐信
2015/03/27 职场文书
2016年春节慰问信息大全
2015/11/30 职场文书
Python GUI编程之tkinter 关于 ttkbootstrap 的使用详解
2022/03/03 Python