美文网首页
gunicorn使用

gunicorn使用

作者: 明明就_c565 | 来源:发表于2022-05-27 10:49 被阅读0次

    WSGI

    了解gunicorn之前先了解WSGI

    WSGI是Python Web Server Gateway Interface的简称。WSGI标准在PEP333中定义并被许多框架实现,它规定了一种Web服务器与Web应用程序/框架之间推荐的标准接口,以确保Web应用程序在不同的Web服务器之间具有可移植性,可以让Web应用程序的开发者把精力集中到自己的领域。

    客户端和服务器端进行沟通遵循了HTTP协议, 可以说HTTP就是它们之间沟通的语言。 从HTTP请求到我们的Web程序之间, 还有另外一个转换过程——从HTTP报文到WSGI规定的数据格式。 WSGI则可以视为WSGI服务器和我们的Web程序进行沟通的语言。

    gunicorn简述

    gunicorn-绿色独角兽,是一个 Python 的 WSGI HTTP 服务器。它所在的位置通常是在反向代理(如 Nginx)和一个 web 应用(如Flask)之间。它是一个移植自Ruby的Unicorn项目的pre-fork worker模型,即支持eventlet也支持greenlet。 Gunicorn启动项目之后一定会有一个主进程Master和一个或者多个工作进程。工作进程的数量可以指定。工作进程是实际处理请求的进程。主进程维护服务器的运行。

    安装

    # 安装最新版本的gunicorn

    pip/pip3 install gunicorn

    #安装指定版本的gunicorn

    pip/pip3 install gunicorn==19.9.0

    配置

    模板

    举例 

    cat /opt/test_server/gunicorn.conf.py

    import multiprocessing

    bind = "127.0.0.1:9001"

    workers = multiprocessing.cpu_count()

    threads =  2

    worker_class = "gevent"

    max_requests = 5000

    timeout = 120

    loglevel = "debug"

    accesslog = "/var/log/test_server/gunicorn.access.log"

    errorlog = "/var/log/test_server/gunicorn.error.log"

    启动

    方式一

    gunicorn --workers=2 test_server.main:app

    方式二

    python3 -m gunicorn.app.wsgiapp -c /opt/test_server/gunicorn.conf.py test_server.main:app

     工作模式

    命令行-k STRING或者--worker-class STRING 默认的工作模式是sync,即同步的工作模式。 一共有五种工作模式,分别是 sync, eventlet, gevent, tornado, gthread 。 下面就分别介绍下这些工作模式。

    sync 模式(同步工作模式) 这是最基本的工作模式,也是默认的工作模式,线程为native类型。即请求先来后到,排队模式。

    eventlet 模式(协程异步) eventlet 工作模式是基于eventlet库,利用python协程实现的。要使用该工作模式的话必须先安装eventlet库,并且版本要大于等于0.24.1 安装命令是:pip install eventlet

    gevent模式(协程异步) gevent是基于Greentlet库,利用python协程实现的。 安装命令是:pip install gevent Gunicorn允许通过设置对应的worker类来使用这些异步Python库。这里的设置适用于我们想要在单核机器上运行的gevent:

    gunicorn --worker-class=gevent -w 2  manage:app

    4. tornado模式 tornado利用python Tornado框架来实现。安装命令是:pip install tornado 安装的tornado库的版本要大于等于0.2。

    5. gthread模式 gthread采用的是线程工作模式,利用线程池管理连接,需要安装gthread库。 安装命令是:pip install gthread。 Gunicorn允许每个worker拥有多个线程。在这种场景下,Python应用程序每个worker都会加载一次,同一个worker生成的每个线程共享相同的内存空间。为了在 Gunicorn 中使用多线程。我们使用了 gthreads 模式,指定threads参数。

    工作模式的补充说明

    当worker指定为gevent或者evenlet类型时,线程变成基于Greentlet的task(伪线程),这时候线程数量threads参数是无效的。

    使用gevent模式会出现一些兼容性问题。

    使用gevent时,系统会使用monkey patch。系统的部分函数会被修改, 有些库会兼容gevent的类型, 例如,任务调度的库apscheduler,web socket需要socketio的库等,需要专门选择gevent的函数。 而有些库则直接无法使用,例如多进程multiprocess。 例如,在一个api请求中,如果需要使用多核cpu资源,采用multiprocess进行多进程计算。则会出现卡死的问题。gevent中,不能使用multiprocess库。

    性能实践

    如果这个应用是I/O受限,通常可以通过使用**“伪线程”(gevent或asyncio)的工作模式**来得到最佳性能。正如我们了解到的,Gunicorn通过设置合适的worker类并将workers数量调整到(2*CPU)+1来支持这种编程范式。

    如果这个应用是CPU受限,那么应用程序处理多少并发请求就并不重要,唯一重要的是并行请求的数量。因为Python’s GIL,线程和’伪线程’并不能以并行模式执行,可以将worker的数量改成CPU的核数,理解到最大的并行请求数量其实就是核心数。这时候适合的工作模式是sync工作模式。

    如果不确定应用程序的内存占用,使用多线程以及相应的gthread worker类会产生更好的性能,因为应用程序会在每个worker上都加载一次,并且在同一个worker上运行的每个线程都会共享一些内存,但这需要一些额外的CPU消耗。

    如果你不知道你自己应该选择什么就从最简单的配置开始,就只是 workers 数量设置为 (2*CPU)+1 并且不用考虑 多线程。从这个点开始,就是所有测试和错误的基准环境。如果瓶颈在内存上,就开始引入多线程。如果瓶颈在 I/O 上,就考虑使用不同的 Python 编程范式。如果瓶颈在 CPU 上,就考虑添加更多内核并且调整 workers 数量。

    参考原文

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

    相关文章

      网友评论

          本文标题:gunicorn使用

          本文链接:https://www.haomeiwen.com/subject/lnoeprtx.html