gunicorn 如何在同步工作线程之间分配请求?

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

我正在使用gunicorn来运行一个简单的HTTP服务器1,例如使用8 个同步工作人员(进程)。出于实际原因,我有兴趣了解gunicorn 如何在这些工作人员之间分配传入请求。

假设所有请求需要相同的时间才能完成。

分配是随机的吗?循环赛?基于资源?

我用来运行服务器的命令:

gunicorn --workers 8 bind 0.0.0.0:8000 main:app

1我正在使用FastAPI,但我相信这与这个问题无关。

python gunicorn
3个回答
7
投票

Gunicorn 不分发请求。

每个工人在

LISTENERS
 中生成相同的 gunicorn.sock.TCPSocket
(例如 
Arbiter.spawn_worker()
),并自行调用
listener.accept()

阻塞操作系统调用中对套接字的

accept()
方法的分配(即稍后由操作系统内核唤醒并给予
client
连接的任何工作程序)是操作系统实现细节,从经验来看,它既不是循环也不是基于资源。

来自文档的参考

来自https://docs.gunicorn.org/en/stable/design.html

Gunicorn 基于预分叉工人模型。 ... 主人对个别客户一无所知。所有请求和响应完全由工作进程处理。

Gunicorn 依赖操作系统在处理请求时提供所有负载平衡。

其他阅读


2
投票

就我而言(也使用 FastAPI),我发现 它以循环方式开始,然后一旦所有工作人员都满了就变得愚蠢

示例:

  • 您同时发送 100 个请求
  • 前 8 个分布在 8 个同步工作线程中
  • 剩下的 92 个将被分配给前 8 个中第一个空闲的工人
  • 只有当所有(或许多)工人再次空闲时,新的请求才会以更平衡的方式分配给那些工人

我正在尝试修复上述 92 个请求的低效行为。到目前为止还没有成功。

希望其他人可以添加他们的见解??


0
投票

在我的例子中:-当我们使用 2 个工作线程创建一个 Gunicorn 并同时发出 20 个请求时,在一定时间内请求会在不同的工作线程上执行,但随后请求开始在同一个工作线程上顺序执行,为什么 Gunicorn 会表现出这种行为? API 的端点是异步的,工作人员是同步的

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