基于Flask的高并发部署方案

news2024/11/20 12:45:24

文章目录

  • 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 os

if 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 logging

gunicorn_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.coloradmin.cn/o/1375280.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

微信小程序swiper实现层叠轮播图

在微信小程序中,需要实现展示5个,横向层叠的轮播图效果,轮播图由中间到2侧的依次缩小.如下图 使用原生小程序进行开发,没有使用Skyline模式,所以layout-type配置项也无效。所以基于swiper组件进行调整。 主要思路就是设置不同的样式&#xff…

Mysql 分割字符串,一行变多行,@rownum,mysql.help_topic

1 前言 朋友最近遇到一个比较棘手的 sql 问题,让我帮忙看看: 他有两张表 testa 和 testb ,一个表存的日期,另一个表存字符串例如 2023-11-01,2023-11-02,如何将这两张表关联起来,只查 testa 表的数据&#…

MES数据采集在制造业的应用

MES设备数据采集的流程包括以下几个步骤: 1. 设备接入:将设备接入MES系统,建立设备与MES系统之间的连接。 2. 数据采集:通过传感器和采集器等设备,采集设备运行数据和状态信息。 3. 数据存储:将采集到的设…

如何给字符串字段添加索引

MySQL是支持前缀索引的,可以定义字符串的一部分作为索引,如果创建索引的语句不指定前缀长度,那么索引就会包含整个字符串。 alter table SUser add index index1(email);alter table SUser add index index2(email(6)); 如上两个创建索引的语…

快速了解VR全景拍摄技术运用在旅游景区的优势

豆腐脑加了糖、烤红薯加了勺,就连索菲亚大教堂前都有了“人造月亮”,在这个冬季,“尔滨”把各地游客宠上了天。面对更多的游客无法实地游玩,哈尔滨冰雪世界再添新玩法,借助VR全景拍摄技术对冬季经典冰雪体验项目进行全…

机器学习_9、朴素贝叶斯

朴素贝叶斯解决鸢尾花数据集问题 #高斯朴素贝叶斯分类 #codingutf-8 from sklearn.datasets import load_iris from sklearn.model_selection import train_test_split from sklearn.naive_bayes import GaussianNB import numpy as np# 导入数据集,并查看数据特征…

ssm+vue的城投公司企业人事管理系统设计与实现(有报告)。Javaee项目,ssm vue前后端分离项目。

演示视频: ssmvue的城投公司企业人事管理系统设计与实现(有报告)。Javaee项目,ssm vue前后端分离项目。 项目介绍: 采用M(model)V(view)C(controller&#x…

华为鸿蒙凉了?谣言还是

华为鸿蒙系统凉了吗?我们从目前的一系列新闻来看。鸿蒙并没有凉,反而愈发强大。从下面的一些新闻事实可以看出华为鸿蒙已经和Android、ios形成竞争对手了。 1、华为宣布鸿蒙4.0的发布 2023年7月,华为开发者大会上正式宣布。华为发布了备受期…

springboot摄影跟拍预定管理系统源码和论文

首先,论文一开始便是清楚的论述了系统的研究内容。其次,剖析系统需求分析,弄明白“做什么”,分析包括业务分析和业务流程的分析以及用例分析,更进一步明确系统的需求。然后在明白了系统的需求基础上需要进一步地设计系统,主要包罗软件架构模式、整体功能模块、数据库设计。本项…

2024年1月1日孙溟㠭篆刻艺术展开幕式于北京大学北大书店成功举办

“印记青春——会说话的石头” 主题文化展盛大开幕 2024年1月1日正值新年伊始,由北京大学出版社、北大书店、不黑文化艺术学社、中国诗书画研究会三才书画院联合举办的“印记 青春——会说话的石头”主题篆刻艺术展,在北京大学新太阳学生中心拉开帷幕。 …

base64与BytesIO图片进行编码、解码;api调用

base64与BytesIO简单介绍 io.BytesIO 和 Base64 编码都是用于在内存中处理二进制数据的方法,但它们的目的和使用场景有所不同。 1) io.BytesIO io.BytesIO 是 Python io 库中的一个类,它提供了一个在内存中处理二进制数据的接口&#xff0…

【排序】快速排序(C语言实现)

文章目录 前言1. Hoare思想2. 挖坑法3. 前后指针法4. 三路划分5. 快速排序的一些小优化5.1 三数取中常规的三数取中伪随机的三数取中 5.2 小区间优化 6. 非递归版本的快排7. 快速排序的特性总结 前言 快速排序是Hoare于1962年提出的一种二叉树结构的交换排序方法,其…

设计模式之组合模式【结构型模式】

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档> 学习的最大理由是想摆脱平庸,早一天就多一份人生的精彩;迟一天就多一天平庸的困扰。各位小伙伴,如果您: 想系统/深入学习某…

Python expandtabs()与endswith()方法

Python expandtabs()方法 描述 Python expandtabs() 方法把字符串中的 tab 符号(\t)转为空格,默认的空格数 tabsize 是 8。 语法 expandtabs()方法语法: string.expandtabs(tabsize8) 参数 tabsize -- 指定转换字符串中的 tab 符号(\t)转为空格的字…

边缘计算AI智能分析网关V4算力分析及应用场景

一、硬件介绍 智能分析网关V4是TSINGSEE青犀视频推出的一款高性能、低功耗的软硬一体AI边缘计算硬件设备,硬件采用BM1684芯片,集成高性能8核ARM A53,主频高达2.3GHz。硬件内置近40种AI算法模型,支持对接入的视频图像进行人、车、…

msvcr120.dll是什么?msvcr120.dll丢失要怎么去修复?

随着计算机技术的不断发展,我们在使用软件或游戏时经常会遇到各种错误提示,其中找不到msvcr120.dll就是一种常见的错误。那么,msvcr120.dll是什么?它的作用是什么?如何修复msvcr120.dll丢失的问题?本文将为…

20个很棒的SEO博客和网站

搜索引擎优化 (SEO) 标准在不断变化。与社交媒体、电子邮件营销和人工智能 (AI) 等新兴技术一样,搜索引擎正在改进它们每天向用户提供结果的方式。 为此,他们专注于本地化、页面权限、点击率,甚…

数据结构与算法之美学习笔记:46 | 概率统计:如何利用朴素贝叶斯算法过滤垃圾短信?

目录 前言算法解析总结引申 前言 本节课程思维导图: 上一节我们讲到,如何用位图、布隆过滤器,来过滤重复的数据。今天,我们再讲一个跟过滤相关的问题,如何过滤垃圾短信? 垃圾短信和骚扰电话,我…

【MYSQL】MYSQL 的学习教程(十二)之 MySQL 啥时候用记录锁,啥时候用间隙锁

在「读未提交」和「读已提交」隔离级别下,都只会使用记录锁;而对于「可重复读」隔离级别来说,会使用记录锁、间隙锁和 Next-Key 锁 那么 MySQL 啥时候会用记录锁,啥时候会用间隙锁,啥时候又会用 Next-Key 锁呢&#xf…

美客多本土店与跨境店有何区别?本土店如何入驻运营?

美客多被誉为“拉美亚马逊”,作为拉美地区最大的跨境电商平台,吸引了不少跨境电商卖家入驻。但在入驻过程中也会遇到一个问题,本土店与跨境店分别是什么?有何区别?应该选择本土店还是跨境店入驻呢?下面为你…