Gunicorn工人阶级
Gunicorn 有worker_class 设置。一些可能的值是
同步 这是默认的工人阶级。每个进程一次处理 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在工作进程中创建了一些伪线程?
性能提升来自于使用“gevent”库提供的“greenlet”或“伪线程”
希望这能消除您的疑虑!继续编码!!