【Python进阶实战】Flask接口并发实战

【Python进阶实战】Flask接口并发实现

前言

Python版本:3.12.3

IDE:Pycharm 2024.1

对于Flask接口阻塞问题,在网上搜寻许久,没有人写一个完整简洁的说明

对于经常使用Flask框架写接口的人来说,接口阻塞问题一直是一块心病

这边将会比较简单明了的说明Flask框架的接口并发是如何实现的

也就是当一个接口阻塞的时候,并不影响其他接口的调用

如果想详细了解Flask框架的话,可以访问下面传送门:

【Flask框架详细介绍】传送门

如果是初学者还不知道怎么安装Flask框架,请访问下面传送门:

【Flask框架官方中文安装教学】传送门

Flask阻塞接口

如果想直接看Flask并发接口实现

可以直接在目录选择【Flask并发接口】直接跳转

接口实现

我们先实现两个最基本的Flask接口,代码如下:

python 复制代码
from time import sleep

from flask import Flask

app = Flask(__name__)


# GET请求
@app.route('/get1', methods=['GET'])
def get1():
    # 访问该请求时,阻塞10秒,用来测试接口阻塞
    sleep(10)
    return 'Tony'


@app.route('/get2', methods=['GET'])
def get2():
	# 接口get2不延迟,用来判断阻塞
    return 'Winnie'



if __name__ == '__main__':
	# Flask服务器启动,为了方便测试,把debug设置为True
    app.run(host='0.0.0.0', port=8080, debug=True))

debug=True:这开启了调试模式,它提供了以下几个有用的特性:

  • 服务器会在代码修改后自动重新加载。
  • 当发生错误时,会显示一个交互式的调试器。
  • 日志记录级别被设置为DEBUG,这意味着你会看到更多的输出信息。

运行时控制台日志如下:

运行地址显示后,代表运行成功(运行地址如下)

接口阻塞

这时候,可以打开你的Postman进行接口测试

或用你的浏览器访问以下地址:

直接点击下面传送门可直接测试

当你访问 http://127.0.0.1:8080/get1 接口时

10秒内访问 http://127.0.0.1:8080/get2,这时这个接口是阻塞的

Flask并发接口

接口实现

python 复制代码
from time import sleep

from flask import Flask

app = Flask(__name__)


# GET请求
@app.route('/get1', methods=['GET'])
def get1():
    # 访问该请求时,阻塞10秒,用来测试接口阻塞
    sleep(10)
    return 'Tony'


@app.route('/get2', methods=['GET'])
def get2():
    return 'Winnie'


if __name__ == '__main__':
	# 代码区别在于这边,运行参数最后增加 threaded=True,代表多线程运行
    app.run(host='0.0.0.0', port=8080, debug=True, threaded=True)

代码运行后的控制台日志和上面无异

关键在于 app.run() 中的 threaded=True 参数

这个参数使得Flask使用多线程来处理请求

接口并发

直接点击下面传送门可直接测试

这时当访问get1阻塞时

在10秒内访问get2,可以正常返回内容

服务部署

Flask官方不推荐使用app.run()这种方式直接部署到生产环境使用

但是如果并发量小的项目,偷偷懒直接打包使用也是没什么大碍的

Windows部署

这边简单提醒一下,还在用Python老版本的朋友们

Python 3.9版本(包括 3.9)以后需要Windows 8.1或更高版本的系统支持

请注意,即使 Python 3.8 支持 Windows 7,官方也推荐使用最新版本的 Windows 以获得最佳性能和安全性

如果你正在使用 Windows 7,并且需要在上面运行 Python,建议安装 Python 3.8 版本

同时,由于 Windows 7 已经停止了微软的官方支持,为了系统安全,建议升级到更新的操作系统版本

关于Windows部署,使用打包工具pyinstaller打包成exe部署

使用说明传送门:【Python实战】python打包工具pyinstaller详解

Linux部署

官方推荐使用WSGI服务器

因为Python内置的WSGI Server无法实现并发的场景

这边推荐gunicorn服务器,gunicorn服务器也是基于WSGI Server构建的

gunicorn安装

Python安装版本要求:Python >= 3.7

安装命令如下:

bash 复制代码
pip install gunicorn

gunicorn运行

运行命令如下:

bash 复制代码
gunicorn -w 4 -b 0.0.0.0:8080 app:app

"-w 4"代表使用的是4个工作(worker)进程,按照项目的需求进行配置

"-b 0.0.0.0:8080"代表的是绑定(bind)到本机地址的 8080 端口

"app:app" 表示 Gunicorn 应该从 app.py 文件中导入名为 app 的应用程序实例

这条命令无法在Windows操作系统下使用,运行时会提示会缺少"fcntl"模块

运行结果如下:

bash 复制代码
[2014-09-10 10:22:28 +0000] [30869] [INFO] Listening at: http://127.0.0.1:8080 (30869)
[2014-09-10 10:22:28 +0000] [30869] [INFO] Using worker: sync
[2014-09-10 10:22:28 +0000] [30874] [INFO] Booting worker with pid: 30874
[2014-09-10 10:22:28 +0000] [30875] [INFO] Booting worker with pid: 30875
[2014-09-10 10:22:28 +0000] [30876] [INFO] Booting worker with pid: 30876
[2014-09-10 10:22:28 +0000] [30877] [INFO] Booting worker with pid: 30877

官方推荐用Nginx服务器做代理转发,这样对gunicorn服务器比较安全高效

官方文档传送门:gunicorn官方文档

结语

在这片技术的海洋中,每一篇博客都是一盏灯塔,照亮求知的航程。

对我而言,撰写博客不仅是一种分享,更是一份热爱与执着。

每当看到读者留言,提到通过我的文章解决了困扰他们已久的技术难题,那份喜悦和成就感便油然而生。这,就是我的动力源泉。

我相信,技术的魅力在于它的普惠性。

无论是初学者还是资深开发者,我们都在这个不断进化的领域中探索和学习。

我乐于分享我的知识,也渴望从你的经验中汲取智慧。

让我们一起,以代码为桥,以创新为帆,携手在这技术的广阔天地中遨游。

所以,无论你何时遇到难题,无论问题大小,都欢迎你来找我。

在这里,我们共同进步,共同成长。

记住,技术之路或许崎岖,但绝对值得。我将与你们同在,一起攀登技术的高峰,一起书写属于我们的精彩篇章!

我是爱弹吉他的小盆友,很高兴能够帮助到您!

相关推荐
进击的女IT几秒前
SpringBoot上传图片实现本地存储以及实现直接上传阿里云OSS
java·spring boot·后端
一 乐1 小时前
学籍管理平台|在线学籍管理平台系统|基于Springboot+VUE的在线学籍管理平台系统设计与实现(源码+数据库+文档)
java·数据库·vue.js·spring boot·后端·学习
不知所云,1 小时前
qt cmake自定义资源目录,手动加载资源(图片, qss文件)
开发语言·qt
安冬的码畜日常2 小时前
【玩转 JS 函数式编程_006】2.2 小试牛刀:用函数式编程(FP)实现事件只触发一次
开发语言·前端·javascript·函数式编程·tdd·fp·jasmine
阑梦清川2 小时前
Java继承、final/protected说明、super/this辨析
java·开发语言
PythonFun2 小时前
Python批量下载PPT模块并实现自动解压
开发语言·python·powerpoint
加油,旭杏2 小时前
【中间件学习】fastCG介绍和使用
学习·nginx·fastcgi
Death2002 小时前
Qt 6 相比 Qt 5 的主要提升与更新
开发语言·c++·qt·交互·数据可视化
机器视觉知识推荐、就业指导2 小时前
使用Qt实现实时数据动态绘制的折线图示例
开发语言·qt
炼丹师小米3 小时前
Ubuntu24.04.1系统下VideoMamba环境配置
python·环境配置·videomamba