带Gevent的Gunicorn,性能增益

2024-06-01 03:30:50 发布

您现在位置:Python中文网/ 问答频道 /正文

Gunicorn工人阶级

Gunicorn具有worker_类设置。一些可能的值是

  • 同步
  • gthread
  • 格温特

Definitions from Luis Sena's nice blog

同步 这是默认的工人类。每个进程一次处理一个请求,您可以使用参数-w来设置worker

工人数量建议为2–4 x$(NUM_CORES),尽管这取决于应用程序的工作方式

gthread 如果使用gthread,Gunicorn将允许每个工作线程具有多个线程。在本例中,Python应用程序每个工作线程加载一次,并且由同一工作线程生成的每个线程共享相同的内存空间

这些线程将由GIL决定,但在发生I/O阻塞时,它仍然很有用。它将允许您在不增加太多内存的情况下处理更多并发性

gevent Eventlet和gevent使用“绿色线程”或“伪线程”,并且基于greenlet

实际上,如果您的应用程序工作主要是I/O绑定的,那么它将允许在单个进程上扩展到潜在的数千个并发请求

即使在异步框架(fastapi、sanic等)兴起的今天,这仍然是相关的,因为它允许您在不增加代码复杂性的情况下优化I/O

他们设法做到这一点的方法是通过“猴子补丁”您的代码,主要是用gevent包中兼容的协作副本替换阻塞部分

它使用epoll、kqueue或libevent实现高度可扩展的非阻塞I/O。协同路由确保开发人员使用类似于线程的阻塞编程风格,但提供非阻塞I/O的好处

这通常是运行django/flask/etc web应用程序最有效的方法,因为大部分时间延迟都来自I/O相关的工作

员工价值观

使用gevent时,未设置工作线程数。文档settings - threads说线程只与gthread工作线程相关。所以gevent只有工人。据我所知,每个工人都是一个独立的操作系统进程。4芯机器的工人数量为8到16人

性能增益来自哪里

那么真的没有执行任何线程吗?如果没有任何线程,gevent工作线程如何获得性能。应该有一些并发执行的伪线程。当一些伪线程进行I/O时,应该检测到它,并执行另一个伪线程。那么,这又是一个伪线程在哪里呢?是其他工作进程还是gunicorn在工作进程中创建了一些伪线程


Tags: 方法代码应用程序数量进程情况gevent性能