0


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:

  1. pip install gunicorn

1.2 确认安装

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

  1. gunicorn --version

2 特性

  1. 高性能:基于预分叉(pre-fork)模型,能够高效处理并发请求。
  2. 简单易用:配置简单,支持多种命令行参数和配置文件。
  3. 灵活:支持多种工作模式(如同步、异步、基于事件循环的工作模式),适应不同的应用需求。
  4. 可扩展:支持自定义中间件、钩子函数等,方便扩展功能。
  5. 广泛支持:兼容多种 Python Web 框架,如 Django、Flask、FastAPI 等。

3 基本功能

3.1 启动一个简单的应用

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

  1. # app.py
  2. from flask import Flask
  3. app = Flask(__name__)
  4. @app.route('/')
  5. def hello_world():
  6. return 'Hello, World!'
  7. if __name__ == '__main__':
  8. app.run()

启动应用:

  1. gunicorn app:app

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

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

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

3.3 使用配置文件

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

  1. # gunicorn_config.py
  2. workers = 4
  3. bind = '127.0.0.1:8000'
  4. loglevel = 'debug'
  5. accesslog = '-'
  6. errorlog = '-'

使用配置文件启动应用:

  1. gunicorn -c gunicorn_config.py app:app

4 高级功能

4.1 使用多种工作模式

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

1. 同步模式

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

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

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

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

适用于异步框架,如 FastAPI:

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

4.2 自定义中间件

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

  1. # middleware.py
  2. from gunicorn.middleware import Middleware
  3. class CustomMiddleware(Middleware):
  4. def __init__(self, app):
  5. self.app = app
  6. def __call__(self, environ, start_response):
  7. # 在此处添加自定义逻辑
  8. return self.app(environ, start_response)

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

  1. # gunicorn_config.py
  2. def when_ready(server):
  3. server.log.info("Server is ready. Spawning workers")
  4. def pre_fork(server, worker):
  5. server.log.info("Worker is about to be forked")
  6. def post_fork(server, worker):
  7. server.log.info("Worker spawned")
  8. def pre_exec(server):
  9. server.log.info("Forked child, re-executing")
  10. def post_request(worker, req, environ, resp):
  11. worker.log.debug("%s %s" % (req.method, req.path))
  12. preload_app = True
  13. worker_class = 'sync'
  14. workers = 4
  15. bind = '127.0.0.1:8000'
  16. loglevel = 'debug'
  17. accesslog = '-'
  18. errorlog = '-'

4.3 钩子函数

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

  1. # gunicorn_config.py
  2. def on_starting(server):
  3. print("Starting Gunicorn")
  4. def on_exit(server):
  5. print("Exiting Gunicorn")
  6. def pre_request(worker, req):
  7. print(f"Request: {req.method} {req.path}")
  8. def post_request(worker, req, environ, resp):
  9. print(f"Response: {resp.status}")
  10. bind = '127.0.0.1:8000'
  11. workers = 4

5 实际应用场景

5.1 部署 Flask 应用

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

  1. # app.py
  2. from flask import Flask
  3. app = Flask(__name__)
  4. @app.route('/')
  5. def hello_world():
  6. return 'Hello, World!'
  7. if __name__ == '__main__':
  8. app.run()

启动应用:

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

5.2 部署 Django 应用

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

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

5.3 部署 FastAPI 应用

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

  1. # app.py
  2. from fastapi import FastAPI
  3. app = FastAPI()
  4. @app.get('/')
  5. def read_root():
  6. return {"Hello": "World"}

启动应用:

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

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

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

  1. # middleware.py
  2. from gunicorn.middleware import Middleware
  3. class AccessLogMiddleware(Middleware):
  4. def __init__(self, app):
  5. self.app = app
  6. def __call__(self, environ, start_response):
  7. request_method = environ.get('REQUEST_METHOD')
  8. path_info = environ.get('PATH_INFO')
  9. print(f"Access log: {request_method} {path_info}")
  10. return self.app(environ, start_response)
  11. # gunicorn_config.py
  12. def when_ready(server):
  13. server.log.info("Server is ready. Spawning workers")
  14. def pre_fork(server, worker):
  15. server.log.info("Worker is about to be forked")
  16. def post_fork(server, worker):
  17. server.log.info("Worker spawned")
  18. def pre_exec(server):
  19. server.log.info("Forked child, re-executing")
  20. def post_request(worker, req, environ, resp):
  21. worker.log.debug("%s %s" % (req.method, req.path))
  22. preload_app = True
  23. worker_class = 'sync'
  24. workers = 4
  25. bind = '127.0.0.1:8000'
  26. loglevel = 'debug'
  27. accesslog = '-'
  28. errorlog = '-'

6 总结

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

THE END !

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


本文转载自: https://blog.csdn.net/csdn_xmj/article/details/140725450
版权归原作者 双木的木 所有, 如有侵权,请联系我们删除。

“python | gunicorn,一个非常实用的 Python 库!”的评论:

还没有评论