我正在使用gunicorn来运行一个简单的HTTP服务器1,例如使用8 个同步工作人员(进程)。出于实际原因,我有兴趣了解gunicorn 如何在这些工作人员之间分配传入请求。
假设所有请求需要相同的时间才能完成。
分配是随机的吗?循环赛?基于资源?
我用来运行服务器的命令:
gunicorn --workers 8 bind 0.0.0.0:8000 main:app
1我正在使用FastAPI,但我相信这与这个问题无关。
Gunicorn 不分发请求。
每个工人在
LISTENERS
中生成相同的 gunicorn.sock.TCPSocket
(例如
Arbiter.spawn_worker()
),并自行调用 listener.accept()
。
阻塞操作系统调用中对套接字的
accept()
方法的分配(即稍后由操作系统内核唤醒并给予 client
连接的任何工作程序)是操作系统实现细节,从经验来看,它既不是循环也不是基于资源。
来自https://docs.gunicorn.org/en/stable/design.html:
Gunicorn 基于预分叉工人模型。 ... 主人对个别客户一无所知。所有请求和响应完全由工作进程处理。
Gunicorn 依赖操作系统在处理请求时提供所有负载平衡。
就我而言(也使用 FastAPI),我发现 它以循环方式开始,然后一旦所有工作人员都满了就变得愚蠢。
示例:
我正在尝试修复上述 92 个请求的低效行为。到目前为止还没有成功。
希望其他人可以添加他们的见解??
在我的例子中:-当我们使用 2 个工作线程创建一个 Gunicorn 并同时发出 20 个请求时,在一定时间内请求会在不同的工作线程上执行,但随后请求开始在同一个工作线程上顺序执行,为什么 Gunicorn 会表现出这种行为? API 的端点是异步的,工作人员是同步的