基于Flask的高并发部署方案

文章目录

  • Flask方案
    • 简介
    • 服务端代码
    • 客户端代码
  • Gevent +Flask方案
    • 简介
    • 安装
    • 示例
  • gunicorn+Flask 部署服务
    • 简介
    • 安装
    • 示例

在AI部署方案中,Flask是最常用的方案!本文列举几种最常用基于Flask的部署方案。

Flask方案

简介

Flask 是一个轻量级的 Python Web 框架,它非常适合构建小型到中型的应用程序。下面是对 Flask 的详细解释和简单示例:

Flask 的特点:

  1. 轻量级:相比于 Django,Flask 更轻量级,更适合小型项目或微服务。
  2. 简单:Flask 的 API 非常简洁,易于学习和使用。
  3. 灵活:Flask 提供了基础功能,但并不限制开发者如何实现这些功能。
  4. 扩展性强:有许多针对 Flask 的扩展,可以轻松地添加新功能。

基本组件:

  1. 路由:定义了 URL 和处理它们的函数之间的映射关系。
  2. 模板引擎:用于渲染 HTML 页面。
  3. URL 构建:用于构建 URL。
  4. 请求和响应对象:处理 HTTP 请求和响应。
  5. 会话和 Cookie:用于跟踪用户会话。
  6. 错误处理:捕获和处理异常。
  7. 上下文:管理执行环境。

简单示例:

  1. 安装 Flask:首先需要安装 Flask。可以使用 pip 进行安装。
pip install flask

服务端代码

新建server.py

from flask import request, Flask
import base64
import cv2
import numpy as np
app = Flask(__name__)
@app.route("/get_frame", methods=['POST','GET'])
def get_frame():#解析图片数据img_card = base64.b64decode(request.form['image'])image_data = np.frombuffer(img_card, np.uint8)image_data = cv2.imdecode(image_data, cv2.IMREAD_COLOR)cv2.imwrite('01.png', image_data)print(image_data)return 'koukou'if __name__ == "__main__":app.run("0.0.0.0", port=5005)

然后运行

客户端代码

新建test.py,代码如下:

import json
import requests
import base64
from PIL import Image
import numpy as np
from io import BytesIO
#将图片数据转成base64格式
img_path='./test/䗉螺42.jpg'
imag=Image.open(img_path)
img_buffer = BytesIO()
imag.save(img_buffer, format='JPEG')
byte_data = img_buffer.getvalue()
base64_str = base64.b64encode(byte_data).decode()
res = {"image":base64_str}
#访问服务
info = requests.post("http://127.0.0.1:5005/get_frame",data=res)
print(info.text)

运行客户端,向服务端发请求,结果如下:
在这里插入图片描述

Gevent +Flask方案

简介

Gevent 是一个 Python 的并发库,它使用 greenlet(轻量级线程)实现协程,允许开发者以同步的方式编写异步代码,从而提高并发性能。

以下是 Gevent 的一些主要特点:

  1. 基于 greenlet 的协程:Gevent 利用 greenlet 实现协程,使得代码在等待 I/O 操作时能够被调度到其他 greenlet 上执行。
  2. 非阻塞 I/O:Gevent 使用 libevent 库实现非阻塞 I/O,可以处理大量并发连接。
  3. 透明地支持同步和异步代码:使用 Gevent,开发者可以以同步的方式编写异步代码,无需修改现有代码或使用回调函数。
  4. 事件循环:Gevent 使用了类似 Node.js 的事件循环模型,可以轻松地处理高并发场景。
  5. 集成其他库:Gevent 可以与许多其他 Python 库集成,如 SQLAlchemy、requests 等,使得这些库也支持异步操作。

使用 Gevent,你可以轻松地编写并发代码,提高应用程序的性能和响应能力。它适用于各种场景,如 Web 开发、网络爬虫、实时通信等。

安装

pip install gevent

示例

下面就是一个简单的gevent 示例:

from gevent import monkey
from gevent.pywsgi import WSGIServer
monkey.patch_all()
from multiprocessing import  Process
import flask
from flask import request
import redis
import uuid
import time# initialize our Flask application and Redis server
app = flask.Flask(__name__)@app.route("/")
def homepage():return "Hello World!"@app.route("/predict", methods=["POST"])
def predict():if flask.request.method == "POST":json_data = request.get_data()params = json.loads(json_data)img_card = params['image']return 'koukou'def run(MULTI_PROCESS):if MULTI_PROCESS == False:WSGIServer(('0.0.0.0', 8080), app).serve_forever()else:mulserver = WSGIServer(('0.0.0.0', 8080), app)mulserver.start()def server_forever():mulserver.start_accepting()mulserver._stop_event.wait()for i in range(15):p = Process(target=server_forever)p.start()if __name__ == "__main__":# 单进程 + 协程run(False)# 多进程 + 协程#run(True)

注意:多进程+协程只能在Linux上使用,在Win上会报错了!
客户端代码:

import json
import requests
import base64
from PIL import Image
import numpy as np
from io import BytesIO
#将图片数据转成base64格式
img_path='./test/䗉螺42.jpg'
imag=Image.open(img_path)
img_buffer = BytesIO()
imag.save(img_buffer, format='JPEG')
byte_data = img_buffer.getvalue()
base64_str = base64.b64encode(byte_data).decode()
res = {"image":base64_str}
#访问服务
info = requests.post("http://127.0.0.1:8080/predict",data=res)
print(info.text)

gunicorn+Flask 部署服务

简介

Gunicorn 是一个高性能的 Python WSGI HTTP 服务器,主要用于部署 Python Web 应用。以下是 Gunicorn 的主要特点和详解:

  1. WSGI HTTP 服务器:Gunicorn 是一个 WSGI HTTP 服务器,可以与各种 Web 框架(如 Flask、Django 等)无缝集成。它使用预fork模式,能够在启动时预先fork出指定数量的 worker 进程来处理请求。
  2. 高性能:由于采用了预fork模式,Gunicorn 在处理请求时具有高性能。它还支持多线程或多进程,可以根据实际需求进行配置。
  3. 简单易用:安装和使用 Gunicorn 都非常简单。可以通过 pip 安装,然后通过命令行运行。同时,Gunicorn 还支持配置文件,可以方便地配置各种参数。
  4. 兼容性强:Gunicorn 与大多数 Web 框架兼容,如 Flask、Django、Pyramid 等。它还支持各种WSGI应用,可以与各种 Python 库和工具集成。
  5. 扩展性高:如果需要更多的功能,可以通过扩展 Gunicorn 或使用其他第三方工具与 Gunicorn 集成。

安装

pip install gunicorn

注意:gunicorn是Linux特有的库,建议使用Linux。

示例

创建gunicorn配置文件,在项目跟目录创建一个gunicorn.py文件,代码如下:

import gevent.monkey
gevent.monkey.patch_all()
import multiprocessing
import osif not os.path.exists('log'):os.mkdir('log')debug = True
loglevel = 'debug'
bind = '127.0.0.1:5005'
pidfile = 'log/gunicorn.pid'
logfile = 'log/debug.log'
errorlog = 'log/error.log'
accesslog = 'log/access.log'# 启动的进程数
workers = 8
worker_class = 'gunicorn.workers.ggevent.GeventWorker'x_forwarded_for_header = 'X-FORWARDED-FOR'

使用gevent模式来支持并发

创建程序入口,在使用Pycharm创建Flask项目的时候,会生成一个app.py的入口文件,里面是创建启动App实例,在这里我们创建一个新的程序入口,用来使用Gunicorn服务,在生产环境中使用。
在项目根目录创建一个app.py的文件,内容如下:

from flask import request, Flask
import base64
import cv2
import numpy as np
app = Flask(__name__)
@app.route("/get_frame", methods=['POST','GET'])
def get_frame():#解析图片数据img_card = base64.b64decode(request.form['image'])image_data = np.frombuffer(img_card, np.uint8)image_data = cv2.imdecode(image_data, cv2.IMREAD_COLOR)cv2.imwrite('01.png', image_data)print(image_data)return 'koukou'if __name__ == "__main__":app.run("0.0.0.0", port=5005)

接下来,在项目根目录创建一个start.py的文件,内容如下:

from app import app
import logginggunicorn_logger = logging.getLogger('gunicorn.error')
app.logger.handlers = gunicorn_logger.handlers
app.logger.setLevel(gunicorn_logger.level)if __name__ == '__main__':app.run()

运行程序,执行命令:

gunicorn -c gunicorn.py start:app

参考文章:

https://zhuanlan.zhihu.com/p/337749105

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python Pandas 中的 shift() 函数,实现数据平移的完美利器!

更多Python学习内容:ipengtao.com shift() 是 Pandas 中一个常用的数据处理函数,它用于对数据进行移动或偏移操作,常用于时间序列数据或需要计算前后差值的情况。本文将详细介绍 shift() 函数的用法,包括语法、参数、示例以及常见…

【算法】最佳牛围栏(二分,前缀和,双指针)

题目 农夫约翰的农场由 N 块田地组成,每块地里都有一定数量的牛,其数量不会少于 1 头,也不会超过 2000 头。 约翰希望用围栏将一部分连续的田地围起来,并使得围起来的区域内每块地包含的牛的数量的平均值达到最大。 围起区域内…

【Android开发】不同Activity之间的数据回传实例(二)星座测算游戏

一、功能介绍 该项目实现的功能主要有: 在程序的首页界面可以输入用户的姓名,并且可以通过下方的日历栏选择自己的出生日期。输入完成后,点击星座测算按钮,则程序跳转到星座分析界面。在该界面上显示用户的个人信息,…

HarmonyOS 开发基础(八)Row和Column

HarmonyOS 开发基础(八)Row和Column 一、Column 容器 1、容器说明: 纵向容器主轴方向:从上到下纵向交叉轴方向:从左到右横向 2、容器属性: justifyContent:设置子元素在主轴方向的对齐格式…

货拉拉智能监控实践:如何解决多云架构下的故障应急问题?

一分钟精华速览 在月活超千万的大规模业务背景下,货拉拉遭遇了多云环境下的监控碎片化、规划无序等问题。为了应对这些挑战,货拉拉开发了一站式监控平台——Monitor。该平台的部署有效地实现了对核心应用的监控和报警全覆盖,显著提高了应急响…

写点东西《Docker入门(上)》

写点东西《Docker入门(上)》 环境变量 Docker 镜像 Docker CMD 与 ENTRYPOINT 有什么区别 Docker 中的网络: Docker 存储: Docker 是一个工具,允许开发人员将他们的应用程序及其所有依赖项打包到一个容器中。然后&…

Java Http各个请求类型详细介绍

1. 前言 在Spring Boot框架中,HTTP请求类型是构建Web应用程序的重要组成部分。常见的请求类型包括GET、POST、PUT和DELETE,每种类型都有其特定的用途和特点。本文将详细比较这四种请求类型,帮助您在开发过程中做出明智的选择。 2. GET请求…

你知道谁才是 “最懂程序员” 的搜索引擎?

大家好,我是奇兵,作为一名程序员,我们开发的过程中几乎每天都和搜索引擎打交道,利用它来搜文档、解决 Bug 等等。 而随着 AI 的发展,搜索引擎也变得越来越智能,市面上也涌现除了越来越多的 AI 搜索引擎。 …

少儿编程 2023年12月中国电子学会图形化编程等级考试Scratch编程三级真题解析(选择题)

2023年12月scratch编程等级考试三级真题 选择题 1、运行左图程序,想得到右图中的效果,红色框应填写的数值是 A、12 B、11 C、10 D、9 答案:D 考点分析:考查积木综合使用,从右边的图形中可以看到第一层小正方形个数为9个,而左边程序中内外层循环的次数都是一样,所以…

机器学习-协同过滤

1、协同过滤要解决的问题 协同过滤算法主要用于推荐系统,推荐系统是信息过载所采用的措施,面对海量的数据信息,从中快速推荐出符合用户特点的物品。一些人的“选择恐惧症”、没有明确需求的人。 解决如何从大量信息中找到自己感兴趣的信息。…

2023年全国职业院校技能大赛软件测试赛题—单元测试卷③

单元测试 一、任务要求 题目1:输入一个大写字母一个小写字母。根据输入的第一个字母和英文周几单词的第一个大写字母判断是周几,如果无法根据第一个大写字母判断,则继续根据输入的第二个小写字母进行判断,最终返回正确的英文周几…

排序之希尔排序

希尔排序,也被称为缩小增量排序,是一种基于插入排序的算法。它通过比较相距一定间隔的元素,来工作,然后再逐渐减小间隔,直到整个数组排序完成。这种算法的主要优点是对于部分有序的数组,其效率非常高&#…