python | gunicorn,一个非常实用的 Python 库!

本文来源公众号“python”,仅用于学术分享,侵权删,干货满满。

原文链接:gunicorn,一个非常实用的 Python 库!

大家好,今天为大家分享一个非常实用的 Python 库 - gunicorn。

Github地址:https://github.com/benoitc/gunicorn

在部署 Python Web 应用程序时,选择合适的 WSGI 服务器是关键的一步。Gunicorn(Green Unicorn)是一个高性能、易于使用的 Python WSGI HTTP 服务器,适用于各种应用部署场景。Gunicorn 设计简洁,支持多种工作模式,能够有效地管理和处理大量并发请求。本文将详细介绍 Gunicorn 库,包括其安装方法、主要特性、基本和高级功能,以及实际应用场景,帮助全面了解并掌握该库的使用。

1 安装

要使用 Gunicorn 库,首先需要安装它。以下是安装步骤:

1.1 使用 pip 安装

可以通过 pip 直接安装 Gunicorn:

pip install gunicorn

1.2 确认安装

安装完成后,可以通过以下命令确认安装是否成功:

gunicorn --version

2 特性

  1. 高性能:基于预分叉(pre-fork)模型,能够高效处理并发请求。

  2. 简单易用:配置简单,支持多种命令行参数和配置文件。

  3. 灵活:支持多种工作模式(如同步、异步、基于事件循环的工作模式),适应不同的应用需求。

  4. 可扩展:支持自定义中间件、钩子函数等,方便扩展功能。

  5. 广泛支持:兼容多种 Python Web 框架,如 Django、Flask、FastAPI 等。

3 基本功能

3.1 启动一个简单的应用

可以通过以下命令启动一个简单的 Flask 应用:

# app.py
from flask import Flaskapp = Flask(__name__)@app.route('/')
def hello_world():return 'Hello, World!'if __name__ == '__main__':app.run()

启动应用:

gunicorn app:app

3.2 指定端口和工作进程数量

可以通过命令行参数指定端口和工作进程数量:

gunicorn -w 4 -b 127.0.0.1:8000 app:app

3.3 使用配置文件

可以将配置参数写入配置文件中,方便管理和复用:

# gunicorn_config.py
workers = 4
bind = '127.0.0.1:8000'
loglevel = 'debug'
accesslog = '-'
errorlog = '-'

使用配置文件启动应用:

gunicorn -c gunicorn_config.py app:app

4 高级功能

4.1 使用多种工作模式

Gunicorn 支持多种工作模式,可以根据应用需求选择合适的模式:

1. 同步模式

适用于大多数应用,默认工作模式:

gunicorn -w 4 -k sync app:app
2. 异步模式

适用于需要处理大量 I/O 操作的应用,如 WebSocket、长连接等:

gunicorn -w 4 -k gevent app:app
3. 基于事件循环的模式

适用于异步框架,如 FastAPI:

gunicorn -w 4 -k uvicorn.workers.UvicornWorker app:app

4.2 自定义中间件

可以编写自定义中间件,扩展 Gunicorn 的功能:

# middleware.py
from gunicorn.middleware import Middlewareclass CustomMiddleware(Middleware):def __init__(self, app):self.app = appdef __call__(self, environ, start_response):# 在此处添加自定义逻辑return self.app(environ, start_response)

在配置文件中使用自定义中间件:

# gunicorn_config.py
def when_ready(server):server.log.info("Server is ready. Spawning workers")def pre_fork(server, worker):server.log.info("Worker is about to be forked")def post_fork(server, worker):server.log.info("Worker spawned")def pre_exec(server):server.log.info("Forked child, re-executing")def post_request(worker, req, environ, resp):worker.log.debug("%s %s" % (req.method, req.path))preload_app = True
worker_class = 'sync'
workers = 4
bind = '127.0.0.1:8000'
loglevel = 'debug'
accesslog = '-'
errorlog = '-'

4.3 钩子函数

Gunicorn 支持多种钩子函数,可以在特定事件发生时执行自定义逻辑:

# gunicorn_config.py
def on_starting(server):print("Starting Gunicorn")def on_exit(server):print("Exiting Gunicorn")def pre_request(worker, req):print(f"Request: {req.method} {req.path}")def post_request(worker, req, environ, resp):print(f"Response: {resp.status}")bind = '127.0.0.1:8000'
workers = 4

5 实际应用场景

5.1 部署 Flask 应用

在生产环境中部署 Flask 应用,使用 Gunicorn 处理并发请求。

# app.py
from flask import Flaskapp = Flask(__name__)@app.route('/')
def hello_world():return 'Hello, World!'if __name__ == '__main__':app.run()

启动应用:

gunicorn -w 4 -b 127.0.0.1:8000 app:app

5.2 部署 Django 应用

在生产环境中部署 Django 应用,使用 Gunicorn 提升并发处理能力。

# 在项目目录下执行
gunicorn myproject.wsgi:application -w 4 -b 127.0.0.1:8000

5.3 部署 FastAPI 应用

在生产环境中部署 FastAPI 应用,使用 Gunicorn 结合 Uvicorn 处理异步请求。

# app.py
from fastapi import FastAPIapp = FastAPI()@app.get('/')
def read_root():return {"Hello": "World"}

启动应用:

gunicorn -w 4 -k uvicorn.workers.UvicornWorker app:app

5.4 自定义中间件实现访问日志

在生产环境中,为应用添加自定义访问日志记录功能。

# middleware.py
from gunicorn.middleware import Middlewareclass AccessLogMiddleware(Middleware):def __init__(self, app):self.app = appdef __call__(self, environ, start_response):request_method = environ.get('REQUEST_METHOD')path_info = environ.get('PATH_INFO')print(f"Access log: {request_method} {path_info}")return self.app(environ, start_response)# gunicorn_config.py
def when_ready(server):server.log.info("Server is ready. Spawning workers")def pre_fork(server, worker):server.log.info("Worker is about to be forked")def post_fork(server, worker):server.log.info("Worker spawned")def pre_exec(server):server.log.info("Forked child, re-executing")def post_request(worker, req, environ, resp):worker.log.debug("%s %s" % (req.method, req.path))preload_app = True
worker_class = 'sync'
workers = 4
bind = '127.0.0.1:8000'
loglevel = 'debug'
accesslog = '-'
errorlog = '-'

6 总结

Gunicorn 库是一个功能强大且易于使用的 WSGI 服务器,能够帮助开发者在各种应用场景中高效地处理并发请求。通过支持多种工作模式、简单易用、灵活可扩展和广泛支持,Gunicorn 提供了强大的功能和灵活的扩展能力。本文详细介绍了 Gunicorn 库的安装方法、主要特性、基本和高级功能,以及实际应用场景。希望本文能帮助大家全面掌握 Gunicorn 库的使用,并在实际项目中发挥其优势。无论是在部署 Flask、Django 还是 FastAPI 应用中,Gunicorn 库都将是一个得力的工具。

THE END !

文章结束,感谢阅读。您的点赞,收藏,评论是我继续更新的动力。大家有推荐的公众号可以评论区留言,共同学习,一起进步。

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

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

相关文章

微信小程序之调查问卷

一、设计思路 1、界面 调查问卷又称调查表,是以问题的形式系统地记载调查内容的一种形式。微信小程序制作的调查问卷,可以在短时间内快速收集反馈信息。具体效果如下所示: 2、思路 此调查问卷采用服务器客户端的方式进行设计,服…

力扣141环形链表问题|快慢指针算法详细推理,判断链表是否有环|龟兔赛跑算法

做题链接 目录 前言: 一、算法推导: 1.假设有环并且一定会相遇,那么一定是在环内相遇,且是快指针追上慢指针。 2.有环就一定会相遇吗?快指针是每次跳两步,有没有可能把慢指针跳过去? 3.那一定…

大模型算法备案流程最详细说明【流程+附件】

文章目录 一、语料安全评估 二、黑盒测试 三、模型安全措施评估 四、性能评估 五、性能评估 六、安全性评估 七、可解释性评估 八、法律和合规性评估 九、应急管理措施 十、材料准备 十一、【线下流程】大模型备案线下详细步骤说明 十二、【线上流程】算法备案填报…

算法-BFS搜索

题目一 解题思路 比较标准的暴力搜索空间换时间的策略 二维数组map表示具体地图,far表示遍历过程中某点到起点的距离。 队列 q 表示在遍历过程中当前距离的所以节点坐标。 每次的节点寻找其上下左右四个方向可以继续前进的点(这里在过程中会发生两个…

pyqt designer使用spliter

1、在designer界面需要使用spliter需要父界面不使用布局,减需要分割两个模块选中,再点击spliter分割 2、在分割后,再对父界面进行布局设置 3、对于两边需要不等比列放置的,需要套一层 group box在最外层进行分割

cesium获取模型的数据包含b3dm和cmpt

getreadyPromise()方法在模型加载完成后调用 url为模型地址 // tileset模型 function tilesetM(url) {tileset viewer.scene.primitives.add(new Cesium.Cesium3DTileset({// url: ../../public/asd/tileset.json,url: url,// type: "3dtiles",maximumScreenSpace…

构建稳固与安全的网络环境:从微软蓝屏事件看软件更新流程与应急响应

“微软蓝屏”事件暴露了网络安全哪些问题? 近日,由微软视窗系统软件更新引发的全球性“微软蓝屏”事件,不仅让科技领域为之震动,更是一次对全球IT基础设施韧性与安全性的深刻检验。这次事件源于美国电脑安全技术公司“众击”的一…

浅谈Mike11中常见的错误及解决方法

前言: 小编对MIKE11比较熟悉,今天为大家总结了mike11中常见的一些错误及解决方法分享给大家。 一:could not open license file 当你打开MIKE11出现这种情况是一般是试用版的License没安装成功,或者安装杀毒软件导致License被当…

SEO与数据中心代理IP的结合能带来哪些便利?

本文将探讨将SEO与数据中心代理IP结合所带来的好处,以及如何利用这种组合来提升网站在搜索引擎中的排名和可见性。 1. 数据中心代理IP的作用和优势 数据中心代理IP指的是由数据中心提供的IP地址,用于隐藏真实服务器的位置和身份。与其他类型的代理IP相…

网络安全常见错误及解决办法(更新中)

# 开启代理,无法连接网络 把代理关掉 # 上一秒还在安装tree,下一秒xshell就连接不上了 —》sshd服务的key这个文件权限过高,跟装tree没有关系,装一个epel 源,epel-release​ 部分命令:chmod 600 /etc/ssh…

可见性::

目录 定义: 解决方法: ①使用synchronized实现缓存和内存的同步 修改一: 加入语句: 代码: 修改2: 在代码块中加入: 代码: 执行结果: 原因: ②使用…

hot100-双指针

283移动零 11盛最多水的容器 暴力解法(超时了)、双指针法 15三数之和 42接雨水

如何关闭页面报错的遮罩层

问题:如何关闭页面报错的遮罩层 解决方法: 在vue.config.js中添加如下配置,重启项目即可 module.exports defineConfig({devServer: {client: {overlay: false,},}})

Android P Input设备变化监听 Storage设备变化监听

InputManager.java中实现了InputDeviceListener接口,只需要新建一个类 implements InputDeviceListener ,并且将类实例化注册给InputManager.getInstance().registerInputDeviceListener即可。 StorageManager同理 StorageManager中会调用StorageEventL…

FastAPI(七十六)实战开发《在线课程学习系统》接口开发-- 课程详情

源码见:"fastapi_study_road-learning_system_online_courses: fastapi框架实战之--在线课程学习系统" 这个接口用户可以不登录,因为我们的课程随意浏览 那么我们梳理下这里的逻辑 1.根据课程id判断课程是否存在 2.课程需要返回课程的详情 3…

【每日刷题】Day86

【每日刷题】Day86 🥕个人主页:开敲🍉 🔥所属专栏:每日刷题🍍 🌼文章目录🌼 1. 118. 杨辉三角 - 力扣(LeetCode) 2. 数组中出现次数超过一半的数字_牛客题霸…

学习笔记---java篇(0723)

p11 Dos 磁盘操作系统,命令操作如下: 命令作用cd 目录路径进入一个目录cd …进入父目录dir查看本目录下的文件和子目录列表cls清除屏幕命令上下键查找敲过的命令Tab键自动补齐命令 二进制转换工具:[进制转换 - 在线工具 (tool.lu)]( p15 …

.h264 .h265 压缩率的直观感受

1.资源文件 https://download.csdn.net/download/twicave/89579327 上面是.264 .265和原始的YUV420文件,各自的大小。 2.转换工具: 2.1 .h264 .h265互转 可以使用ffmpeg工具:Builds - CODEX FFMPEG gyan.dev 命令行参数: …

Linux冯诺依曼体系、操作系统、进程概念、进程状态、进程切换

个人主页:仍有未知等待探索-CSDN博客 专题分栏:Linux 目录 一、冯诺依曼体系结构 二、操作系统 1、概念 2、为什么要有操作系统? 3、理解操作系统 1.管理的本质 2.管理的概念 3.操作系统结构图 4.为什么要有操作系统? 三…

Windows版本免费PyMol的安装

技术背景 在前面一篇博客中,我们介绍过在Linux平台下安装和使用免费版本的PyMol。其实同样的这个免费版在Windows平台上(这里以win11为例)也是支持的。 安装流程 这个免费版本的PyMol依赖于Conda,因此首先需要访问conda官网下载一个miniconda到本地进行安…