Gunicorn 与 Gevent,性能提升

问题描述 投票:0回答:1

Gunicorn工人阶级

Gunicorn 有worker_class 设置。一些可能的值是

  • 同步
  • g线程
  • 活动

来自 Luis Sena 精彩博客的定义

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

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

g线程 如果使用gthread,Gunicorn将允许每个worker拥有多个线程。在这种情况下,每个工作线程加载一次 Python 应用程序,并且同一工作线程生成的每个线程共享相同的内存空间。

这些线程将受到 GIL 的支配,但当发生一些 I/O 阻塞时它仍然很有用。它将允许您处理更多并发性,而无需过多增加内存。

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

在实践中,如果您的应用程序工作主要受 I/O 限制,它将允许其扩展到单个进程上潜在的数千个并发请求。

即使异步框架(fastapi、sanic 等)兴起,这在今天仍然具有相关性,因为它允许您优化 I/O,而无需增加额外的代码复杂性。

他们设法做到这一点的方法是“猴子修补”你的代码,主要是用 gevent 包中兼容的协作对应部分替换阻塞部分。

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

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

员工价值

使用 gevent 工作线程数时未设置。文档设置 - 线程表示线程仅与 gthread 工作线程相关。所以对于 gevent 我们只有工人。据我所知,每个worker都是一个单独的操作系统进程。对于 4 核机器来说,工人数量是 8 到 16 个。

性能增益从何而来

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

python gunicorn gevent
1个回答
1
投票

性能提升来自于使用“gevent”库提供的“greenlet”或“伪线程”

  • 并发:“gevent”使用称为“greenlets”的轻量级单元来处理并发。
  • EventLoop:这允许greenlets在I/O操作期间相互切换,这可以防止一个操作阻塞整个进程。
  • 没有线程,单独的进程:每个工作进程内没有线程。每个工作进程独立运行,运行自己的一组 greenlet。

希望这能消除您的疑虑!继续编码!!

© www.soinside.com 2019 - 2024. All rights reserved.