python gunicorn如何在同步工作者之间分发请求?

oknwwptz  于 2022-12-25  发布在  Python
关注(0)|答案(2)|浏览(364)

bounty将在5天后过期。回答此问题可获得+100声望奖励。tyrex希望引起更多人对此问题的关注:解决我在回答中描述的问题

我正在使用gunicorn运行一个简单的HTTP服务器1,它使用了8个同步工作者(进程)。出于实际原因,我很想知道gunicorn如何在这些工作者之间分配传入的请求。
假设所有请求都需要相同的时间才能完成。
分配是随机的?循环的?基于资源的?
我用来运行服务器的命令:

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

1我正在使用FastAPI,但我认为这与此问题无关。

cx6n0qe3

cx6n0qe31#

Gunicorn不分发请求。
每个工作线程都由Arbiter.spawn_worker()中的相同LISTENERS(例如gunicorn.sock.TCPSocket)派生,并且自己调用listener.accept()
阻塞操作系统调用中对套接字的accept()方法的分配--也就是说,无论哪一个工作者后来被操作系统内核唤醒,并被给予client连接--是一个操作系统实现细节,根据经验,既不是循环调度,也不是基于资源的。

参考文件

https://docs.gunicorn.org/en/stable/design.html开始:
Gunicorn是基于pre-fork工作者模型的。......主进程对单个客户端一无所知。所有的请求和响应都完全由工作进程处理。
Gunicorn在处理请求时依靠操作系统提供所有负载平衡。

其他读数

798qvoo8

798qvoo82#

在我的例子中(也使用FastAPI),我发现它以循环调度开始,然后在所有工作者都满了之后就变得愚蠢了
示例:

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

我正在尝试修复上面提到的92个请求的低效行为。到目前为止还没有成功。
希望其他人能加入他们的见解?

相关问题