当前位置:网站首页>Flask框架实现异步处理请求
Flask框架实现异步处理请求
2022-08-09 04:04:00 【IT之一小佬】
当程序执行过程中多个用户并发执行耗时任务等时,为提高程序性能,这时可以使用异步处理技术来优化系统性能。常见的方法是将请求放到一个线程池或者进程池中进行管理。
本博文以python自带的concurrent.futures库来实现异步处理任务。这个模块具有线程池和进程池、管理并行编程任务、处理非确定性的执行流程、进程或线程同步等功能。
示例代码1:
import time
from flask import Flask, request
from concurrent.futures import ThreadPoolExecutor
# app初始化
app = Flask(__name__)
# 同时处理的最大线程数,本示例中使用线程池,也可以使用进程池ProcessPoolExecutor,使用方法类似
executor = ThreadPoolExecutor(3)
@app.route("/postInfo", methods=["POST"])
def up_name():
"""
接收传递过来的信息
:return:
"""
data = {"data": "data"}
# 执行异步任务
executor.submit(do_job, data)
return data
def do_job(info):
"""
模拟异步任务
:param info:
:return:
"""
print(time.time(), "start:", info)
time.sleep(10)
print(time.time(), "end:", info)
if __name__ == '__main__':
app.run()
使用postman测试工具发起请求,代码中设置的最大异步数为3,本次在postman工具中同时执行请求5次看效果。

运行结果:

示例代码2:
import os
import time
from datetime import datetime
from flask import Flask, request
from werkzeug.utils import secure_filename
from concurrent.futures import ThreadPoolExecutor
# app初始化
app = Flask(__name__)
# 能接收的图片文件的大小
app.config['MAX_CONTENT_LENGTH'] = 2 * 1024 * 1024
# 同时处理的最大线程数,本示例中使用线程池,也可以使用进程池ProcessPoolExecutor,使用方法类似
executor = ThreadPoolExecutor(3)
# 能接收的文件后缀名
ALLOWED_EXTENSIONS = set(['png', 'jpg', 'jpeg'])
# 允许接收的文件类型
def allow_file(filename):
return '.' in filename and filename.rsplit('.', 1)[1] in ALLOWED_EXTENSIONS
@app.route("/uploadImageFile", methods=["POST"])
def upload_image_file():
"""
上传图片数据
:return:
"""
file = request.files['img']
if file and allow_file(file.filename):
filename = secure_filename(file.filename)
if not os.path.exists('temp'):
os.mkdir('temp')
file.save(os.path.join('temp', filename))
# 上传的文件是空文件
if os.stat(os.path.join('temp', filename)).st_size == 0:
os.remove(os.path.join('temp', filename))
return "Empty image file"
# 异步任务
executor.submit(do_job, filename)
return "POST Success"
else:
return "POST failed"
def do_job(filename):
"""
模拟异步任务
:param filename:
:return:
"""
print('{}-start do_job, file={}'.format(datetime.now(), filename))
time.sleep(10)
print('{}-finish do_job'.format(datetime.now()))
if __name__ == '__main__':
app.run()
postman测试:

运行结果:

边栏推荐
猜你喜欢
![[Server data recovery] A case of data recovery when the Ext4 file system cannot be mounted and an error is reported after fsck](/img/65/f16bb466967993934719022145f78c.png)
[Server data recovery] A case of data recovery when the Ext4 file system cannot be mounted and an error is reported after fsck

松柏集(云衣裳)
松柏集(江风起)

技术分享 | 如何模拟真实使用场景?mock 技术来帮你

给电脑重装系统后修改远程桌面端口的方法

Mysql表打不开

driftingblues靶机wp

One Pass 1258 - Digital Pyramid (Dynamic Programming)

Linux安装MySQL8

给一时兴起想要学习 “ 测试 ” 的同学的几条建议.....
随机推荐
"The Sword Offer" Problem Solution - week1 (continuously updated)
笔记本重装系统如何找回之前自己自带的office
【 21 based texture (2, bump mapping theory) 】
Error detected while processing /home/test/.vim/plugin/visualmark.vim
VS2019 compiles boost_1_79, generates 32-bit and 64-bit static libraries
机器人工程师入门知识框架(思维导图)
【21 基础纹理(二、凹凸映射的理论)】
NanoDet代码逐行精读与修改(四)动态软标签分配:dynamic soft label assigner
leetcode 5724. 绝对差值和
记录一次腾讯实习投递经历(一)
[Server data recovery] A case of data recovery when the Ext4 file system cannot be mounted and an error is reported after fsck
进程和计划任务管理
Swift3.0 sets the background color and text color of the status bar
了解CV和RoboMaster视觉组(五)滤波器、观测器和预测方法
发明时代,「幂集创新」事关你我
33 基本统计知识——单项非参数检验
使用Oracle SQL Developer管理Oracle Database Express Edition (XE)
07 类与对象(一)
助力To B业务,这类企业端数据值得风控童鞋关注
driftingblues靶机wp