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

embedded/2024/9/24 17:24:42/

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

  • 前言
  • Flask阻塞接口
    • 接口实现
    • 接口阻塞
  • Flask并发接口
    • 接口实现
    • 接口并发
  • 服务部署
  • 结语

前言

Python版本:3.12.3

IDE:Pycharm 2024.1

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

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

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

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

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

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

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

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

Flask阻塞接口

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

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

接口实现

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

python">from time import sleepfrom flask import Flaskapp = 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设置为Trueapp.run(host='0.0.0.0', port=8080, debug=True))

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

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

运行时控制台日志如下:

在这里插入图片描述

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

  • Running on http://127.0.0.1:8080

接口阻塞

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

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

  • http://127.0.0.1:8080/get1
  • http://127.0.0.1:8080/get2

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

  • get1传送门
  • get2传送门

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

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

Flask并发接口

接口实现

python">from time import sleepfrom flask import Flaskapp = 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传送门
  • get2传送门

这时当访问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_165">gunicorn安装

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

安装命令如下:

pip install gunicorn

gunicorn_174">gunicorn运行

运行命令如下:

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”模块

运行结果如下:

[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官方文档

结语

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

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

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

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

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

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

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

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

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

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

在这里插入图片描述
我是爱弹吉他的小盆友,很高兴能够帮助到您!


http://www.ppmy.cn/embedded/19252.html

相关文章

「ChatGPT」掀起新一轮AI热潮!超越GPT-4 Turbo,商汤日日新大升级!

目录 拳打 GPT-4 Turbo ,脚踢 DALLE 3 端侧大模型,唯快不破 AI 应用落地需要一个即插即用的大模型超市 并不存在 AI 这个行业,只有 AI行业,强调 AI 需要与传统产业合作,这种关系是结合与赋能,而不是颠覆…

Rust序列化和反序列化

Rust 编写python 模块 必备库 docker 启动 nginx 服务 NGINX 反向代理配置

【iOS开发】(六)react Native 路由嵌套传参与框架原理(完)20240423

【iOS开发】(六)react Native 路由嵌套传参与框架原理(完)20240423 感谢拉钩教育的教学。 (五)我们介绍了四种路由导航,这一节我们介绍他们的嵌套传参和框架的整体原理。到这里,大家已经能用RN框架进行一些…

架构师系列- 消息中间件(13)-kafka深入应用

4、深入应用 4.1 springboot-kafka 1)配置文件 kafka:bootstrap-servers: 192.168.10.30:10903,192.168.10.30:10904producer: # producer 生产者retries: 0 # 重试次数acks: 1 # 应答级别:多少个分区副本备份完成时向生产者发送ack确认(可选0、1、all/-1)batch-s…

Vue.js(Axios)

Axios 什么是: Axios 是一个基于 promise 的 HTTP 库,可以用在浏览器和 node.js 中 何时: 主要用于创建请求在浏览器中,创建xhr请求; 在node.js中,创建普通http请求 为什么: 浏览器中创建xhr请求: 4种方案: (1)使用原生XHR对象—…

C++ Primer Plus

第一章 初始C #include <iostream> //#:预处理int main(void) //void:无参数 {using namespace std;int carrots; //定义声明语句:开辟内存空间&#xff0c; int:整型 cout << "how many corrots do you have?" << endl; //cout:输出流(out) end…

JPEG图像常用加密算法简介

JPEG图像加密算法 目前&#xff0c;JPEG图像加密算法可以分成异或加密、置乱加密和置乱与异或组合加密。下面对这三种加密方式进行阐述。 (1) 异或加密 文献[1]提出了一种基于异或加密的JPEG图像的RDH-EI方案。该算法通过对AC系数的ACA和图像的量化表进行流密码异或&#xf…

【MySQL]】数据库操作指南之数据库的基础操作

&#x1f331;博客主页&#xff1a;青竹雾色间 &#x1f331;系列专栏&#xff1a;MySQL探险日记 &#x1f618;博客制作不易欢迎各位&#x1f44d;点赞⭐收藏➕关注 ✨人生如寄&#xff0c;多忧何为 ✨ 文章目录 1. 创建数据库2.数据库的编码集与校验集2.1 编码集 (Character…