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中使用HTMLParser解析HTML的教程
Apr 29 Python
Python实现将数据库一键导出为Excel表格的实例
Dec 30 Python
Ubuntu下使用Python实现游戏制作中的切分图片功能
Mar 30 Python
PyQt5每天必学之滑块控件QSlider
Apr 20 Python
idea创建springMVC框架和配置小文件的教程图解
Sep 18 Python
Python登录系统界面实现详解
Jun 25 Python
python Pandas库基础分析之时间序列的处理详解
Jul 13 Python
Jupyter Notebook 实现正常显示中文和负号
Apr 24 Python
使用keras实现BiLSTM+CNN+CRF文字标记NER
Jun 29 Python
Python Celery异步任务队列使用方法解析
Aug 10 Python
python 对xml解析的示例
Feb 27 Python
Python安装使用Scrapy框架
Apr 12 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
乐信RP2100的电路分析和打磨
2021/03/02 无线电
再次研究下cache_lite
2007/02/14 PHP
php5新改动之短标记启用方法
2008/09/11 PHP
PHP大神的十大优良习惯
2016/09/14 PHP
基于CI(CodeIgniter)框架实现购物车功能的方法
2018/04/09 PHP
来自chinaz的ajax获取评论代码
2008/05/03 Javascript
JQuery 选择器 xpath 语法应用
2010/05/13 Javascript
在图片上显示左右箭头类似翻页的代码
2013/03/04 Javascript
JavaScript cookie的设置获取删除详解
2014/02/11 Javascript
使用forever管理nodejs应用教程
2014/06/03 NodeJs
PassWord输入框代码分享
2016/06/07 Javascript
Javascript中document.referrer隐藏来源的方法
2017/01/16 Javascript
nodejs操作mongodb的增删改查功能实例
2017/11/09 NodeJs
vue2 router 动态传参,多个参数的实例
2017/11/10 Javascript
windows系统下更新nodejs版本的方案
2017/11/24 NodeJs
旺旺在线客服代码 旺旺客服代码生成器
2018/01/09 Javascript
vuejs使用axios异步访问时用get和post的实例讲解
2018/08/09 Javascript
layer弹出层 iframe层去掉滚动条的实例代码
2018/08/17 Javascript
让Python代码更快运行的5种方法
2015/06/21 Python
python中enumerate函数遍历元素用法分析
2016/03/11 Python
Python实现读写sqlite3数据库并将统计数据写入Excel的方法示例
2017/08/07 Python
python 获取文件下所有文件或目录os.walk()的实例
2018/04/23 Python
Python实现多线程的两种方式分析
2018/08/29 Python
Python实现监控键盘鼠标操作示例【基于pyHook与pythoncom模块】
2018/09/04 Python
python将一组数分成每3个一组的实例
2018/11/14 Python
详解python selenium 爬取网易云音乐歌单名
2019/03/28 Python
俄语专业毕业生推荐信
2013/10/28 职场文书
成品仓管员岗位职责
2013/12/11 职场文书
金融管理专业毕业生求职信
2014/03/12 职场文书
乡镇安全生产目标责任书
2014/07/23 职场文书
4s店活动策划方案
2014/08/25 职场文书
2015年前台接待工作总结
2015/05/04 职场文书
甲午风云观后感
2015/06/02 职场文书
分享一些Java的常用工具
2021/06/11 Java/Android
Django实现drf搜索过滤和排序过滤
2021/06/21 Python
windows server2012 R2下安装PaddleOCR服务的的详细步骤
2022/09/23 Servers