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

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

  • 前言
  • Flask阻塞接口
    • 接口实现
    • 接口阻塞
  • Flask并发接口
    • 接口实现
    • 接口并发
  • 服务部署
    • Windows部署
    • Linux部署
      • gunicorn安装
      • gunicorn运行
  • 结语

前言

Python版本:3.12.3

IDE:Pycharm 2024.1

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

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

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

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

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

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

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

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

Flask阻塞接口

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

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

接口实现

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

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,这意味着你会看到更多的输出信息。

运行时控制台日志如下:

在这里插入图片描述

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

  • 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并发接口

接口实现

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传送门
  • 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安装

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

安装命令如下:

pip install gunicorn

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

结语

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

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

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

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

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

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

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

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

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

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/566721.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

沙漠里的气膜场馆,你见过吗?

在茫茫的沙漠之中,一座独特的建筑傲然而立,宛若一朵盛开的奇葩。这并非是传统的砖瓦建筑,也不是典型的钢筋混凝土构造,而是一座气膜场馆,以其轻盈的身姿和独特的设计,在沙漠中展现出了无与伦比的魅力。 这座…

java锁常识

AQS框架 AQS(AbstractQueuedSynchronizer)是 Java 中用于构建锁和同步器的基础框架。它提供了一种实现同步器的方式,使得开发者可以基于 AQS 构建各种类型的同步工具,如独占锁、共享锁、信号量等。 AQS 主要基于 FIFO 队列&…

Qt 集成OSG

Qt 你好 | 专注于Qt的技术分享平台 一&#xff0c;新建一个 QOsgWidget 类&#xff0c;继承自osgQOpenGLWidget #ifndef QOSGWIDGET_H #define QOSGWIDGET_H#include <QObject> #include <osgViewer/Viewer> #include <osgQOpenGL/osgQOpenGLWidget> class…

一种基于PET和ICT的双功能荧光探针,用于同时识别活细胞中的Cys和H2S

文章解读 文章设计了一种易于合成的双功能荧光探针NJB&#xff0c;通过明显的颜色和荧光变化用于对Cys和H2S的双位点响应&#xff0c;。在检测过程中&#xff0c;发生了光诱导电子转移 (photoinduced electron transfer, PET)和分子内电荷转移 (ICT)过程&#xff0c;NJB的颜色和…

ffmpeg支持MP3编码的方法

目录 现象 解决办法 如果有编译包没有链接上的情况 现象 解决办法 在ffmpeg安装包目录下 &#xff0c;通过./configure --list-encoders 和 ./configure --list-decoders 命令可以看到&#xff0c;ffmpeg只支持mp3解码&#xff0c;但是不支持mp3编码。 上网查寻后发现&…

SpringBoot之@Conditional衍生条件装配详解

文章目录 ☃️前言☃️简介☃️示例❄️❄️ConditionalOnProperty❄️❄️ConditionalOnClass❄️❄️ConditionalOnBean❄️❄️自定义条件 ☃️SpringBoot源码中使用☃️总结 欢迎来到 请回答1024 的博客 &#x1f353;&#x1f353;&#x1f353;欢迎来到 请回答1024的博客…

【圆桌论坛】个人作为嘉宾参与问答环节的总结,Create 2024百度AI开发者大会之AI智能体开发与应用论坛

目录 ⭐前言⭐讨论话题✨本质和价值✨端侧部署✨应用商业模式✨商业模式 ⭐主题总结⭐有趣分享 ⭐前言 首先&#xff0c;非常荣幸和开心作为开发者和创业者代表参加百度Create AI大会分论坛圆桌论坛的问答环节。 在分论坛活动开始前&#xff0c;参加了文心智能体平台&#xff…

JS 删除数组元素( 5种方法 )

No.内容链接1Openlayers 【入门教程】 - 【源代码示例300】 2Leaflet 【入门教程】 - 【源代码图文示例 150】 3Cesium 【入门教程】 - 【源代码图文示例200】 4MapboxGL【入门教程】 - 【源代码图文示例150】 5前端就业宝典 【面试题详细答案 1000】 文章目录 一、五种…

vue3中web前端JS动画案例(四)侧边栏横幅效果-右下角广告-淘宝案例

myJsAnimation.js, 这里使用了上次封装的动画方法&#xff0c;并进行了改造 /*** 动画的函数* dom 当前对象* JSON 传入元素对象的属性 {"width": 300, "opacity": 50}* * -------------------- 多物体运动&#xff0c;同时运动 ---传入JSON-------------*…

爬虫零基础学习,第一天,安装环境,requests库常用命令的讲解

Python爬虫 爬虫学习思路 URL内容获取,requests的基本常用语法 import requests # 先向目标网站发送请求 url = "http://www.baidu.com" r

【TensorFlow深度学习】人工智能绪论与深度学习前瞻

人工智能绪论与深度学习前瞻 【引言】人工智能的起源与发展机器学习与深度学习的关系深度学习的兴衰与复兴深度学习的特点与前瞻 【引言】 在信息技术蓬勃发展的今天&#xff0c;人工智能已成为推动科技革新和社会进步的关键驱动力。从最初的计算机辅助人类处理信息&#xff0…

UDP文件传输工具之UDP传输的优点和缺点

在当今快节奏的网络通信时代&#xff0c;UDP以其独特的优势&#xff0c;在众多应用场景中扮演着关键角色。本文将深入探讨UDP的优缺点及其应用场景&#xff0c;并重点介绍镭速软件如何通过技术创新&#xff0c;显著提升UDP传输的效率和可靠性。 UDP传输的优点 UDP的显著优势在…

从奇门WMS-A到金蝶云星空通过接口配置打通数据

从奇门WMS-A到金蝶云星空通过接口配置打通数据 接入系统&#xff1a;奇门WMS-A 用于菜鸟的仓库&#xff08;使用其他支持奇门的仓库同理&#xff09;&#xff0c;故而希望能和仓库的wms系统打通&#xff0c;这样我们采购收货&#xff0c;采购入库&#xff0c;销售出库&#xff…

HTML随机点名程序

案例要求 1.点击点名按钮&#xff0c;名字界面随机显示&#xff0c;按钮文字由点名变为停止 2.再次点击点名按钮&#xff0c;显示当前被点名学生姓名&#xff0c;按钮文字由停止变为点名 案例源码 <!DOCTYPE html> <html lang"en"> <head> <m…

流量反作弊算法简介

参考&#xff1a;流量反作弊算法实践 1. 背景 阅读记录阿里流量作弊的风控文章。甄别阿里妈妈逾千亿商业流量中作弊 与 低质量的部分&#xff0c;保护广告主和平台的利益是风控团队的核心工作之一。 2. 广告风控流程 广告主投放内容与风控团队、下游业务团队的简易交互流程如…

ArrayList与顺序表(2)

前言~&#x1f973;&#x1f389;&#x1f389;&#x1f389; hellohello~&#xff0c;大家好&#x1f495;&#x1f495;&#xff0c;这里是E绵绵呀✋✋ &#xff0c;如果觉得这篇文章还不错的话还请点赞❤️❤️收藏&#x1f49e; &#x1f49e; 关注&#x1f4a5;&#x1…

JavaScript中的map()方法详解

1. map() 的返回值是一个新的数组&#xff0c;新数组中的元素为 “原数组调用函数处理过后的值” 2. 简单使用&#xff1a;遍历整个数组&#xff0c;将大于4的元素乘以2 const array [2, 3, 4, 4, 5, 6]console.log("array",array) const map array.map(x > {…

nfs网络存储配置

准备&#xff1a;yum install rpcbind yum install nfs-server 一台服务器&#xff1a;192.168.220.131 一台客户端&#xff1a;192.168.220.220 服务器&#xff1a; 先启动rpcbind服务&#xff1a;systemctl restart rpcbind 在启动…

B站下行CDN架构的探索与应用

本期作者 背景介绍 B站的下行CDN旧架构如下图所示&#xff0c;可以看到边缘CDN节点与中心调度服务有紧密协作&#xff0c;简单说是先由调度服务进行流量调度(负责均衡的调度到每个网关组件节点&#xff09;&#xff0c;再由回源组件进行集群内的回源收敛&#xff0c;最终到对应…

Rust-01 Hello Rust 10分钟上手编写第一个Rust程序 背景介绍 发展历史 环境配置 升级打怪的必经之路

背景介绍 Rust 是一种多范式、通用的编程语言&#xff0c;强调性能、类型安全和并发性。它通过一个称为“借用检查器”的机制在编译时追踪所有引用的对象生命周期&#xff0c;以强制实现内存安全&#xff0c;即确保所有引用都指向有效的内存&#xff0c;而不需要垃圾收集器。 …