基于Flask的高并发部署方案

这篇具有很好参考价值的文章主要介绍了基于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)

运行客户端,向服务端发请求,结果如下:
基于Flask的高并发部署方案,人工智能,模型部署,flask,python,后端

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文章来源地址https://www.toymoban.com/news/detail-792455.html

到了这里,关于基于Flask的高并发部署方案的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【赠书第18期】人工智能B2B落地实战:基于云和Python的商用解决方案

    文章目录 前言 1 方案概述 2 方案实施 2.1 云平台选择 2.2 Python环境搭建 2.3 应用开发与部署 2.4 应用管理 2.5 安全性与隐私保护 3 方案优势与效益 4 推荐图书 5 粉丝福利 随着云计算技术的快速发展,越来越多的企业开始将业务迁移至云端,以降低成本、提高效率并快速响应市场

    2024年01月25日
    浏览(44)
  • 【实战项目】c++实现基于reactor的高并发服务器

    基于Reactor的高并发服务器,分为反应堆模型,多线程,I/O模型,服务器,Http请求和响应五部分 ​全局 Channel 描述了文件描述符以及读写事件,以及对应的读写销毁回调函数,对应存储arg读写回调对应的参数 ​Channel 异或 |:相同为0,异为1 按位与:只有11为1,其它组合全部

    2024年02月12日
    浏览(53)
  • 基于linux下的高并发服务器开发(第一章)- fcntl函数

    #include unistd.h #include fcntl.h int fcntl(int fd, int cmd, ...); 参数:     fd : 表示需要操作的文件描述符     cmd: 表示对文件描述符进行如何操作          - F_DUPFD : 复制文件描述符,复制的是第一个参数fd,                               得到一个新的文件描述符(返回值)   

    2024年02月16日
    浏览(46)
  • 基于linux下的高并发服务器开发(第一章)- 目录操作函数

     (1)int mkdir(const char* pathname,mode_t mode); #include sys/stat.h #include sys/types.h int mkdir(const char *pathname, mode_t mode);     作用:创建一个目录     参数:          pathname: 创建的目录的路径         mode: 权限,八进制的数     返回值:          成功返回0, 失败返回-1  (

    2024年02月16日
    浏览(45)
  • 基于电商场景的高并发RocketMQ实战-Consumer端队列负载均衡分配机制、并发消费以及消费进度提交

    🌈🌈🌈🌈🌈🌈🌈🌈 【11来了】文章导读地址:点击查看文章导读! 🍁🍁🍁🍁🍁🍁🍁🍁 Consumer 端队列负载均衡分配机制 topic 是有一堆的 queue,而且分布在不同的 broker 上 并且在消费时,将多个 queue 分配给多个 consumer,每一个 consumer 会分配到一部分的 queue 进行消费

    2024年02月03日
    浏览(46)
  • 基于linux下的高并发服务器开发(第一章)- Linux系统IO函数

     (1)man 2 open 打开一个已经存在的文件 int open(const char *pathname, int flags); 参数:             pathname:要打开文件路径             - flags:对文件的操作权限设置还有其他的设置             O_RDONLY,O_WRONLY,O_RDWR 这三个设置是互斥的 返回值:             返回一个新的文件描述

    2024年02月16日
    浏览(61)
  • 基于linux下的高并发服务器开发(第一章)- Makefile(2)1.11

    ◼ 命令在执行之前,需要先检查规则中的依赖是否存在      如果存在,执行命令      如果不存在,向下检查其它的规则,检查有没有一个规则是用来生成这个依赖的,如  果找到了,则执行该规则中的命令。 ◼ 检测更新,在执行规则中的命令时,会比较目标和依赖文

    2024年02月16日
    浏览(56)
  • 基于linux下的高并发服务器开发(第一章)- 模拟实现 ls-l 命令

     这一小节会用到上面两张图的红色框里面的变量 任务: 模拟实现 ls -l 指令 -rw-rw-r-- 1 nowcoder nowcoder 12 12月  3 15:48 a.txt    

    2024年02月16日
    浏览(51)
  • 基于多反应堆的高并发服务器【C/C++/Reactor】(中)完整代码

    Buffer.h Buffer.c Channel.h Channel.c ChannelMap.h ChannelMap.c Dispatcher.h EpollDispatcher.c  PollDispatcher.c SelectDispatcher.c EventLoop.h EventLoop.c HttpRequest.h HttpRequest.c   HttpResponse.h HttpResponse.c TcpConnection.h TcpConnection.c TcpServer.h TcpServer.c ThreadPool.h ThreadPool.c WorkerThread.h WorkerThread.c

    2024年01月20日
    浏览(67)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包