bounty将在5天后过期。回答此问题可获得+100声望奖励。tyrex希望引起更多人对此问题的关注:解决我在回答中描述的问题
我正在使用gunicorn运行一个简单的HTTP服务器1,它使用了8个同步工作者(进程)。出于实际原因,我很想知道gunicorn如何在这些工作者之间分配传入的请求。
假设所有请求都需要相同的时间才能完成。
分配是随机的?循环的?基于资源的?
我用来运行服务器的命令:
gunicorn --workers 8 bind 0.0.0.0:8000 main:app
1我正在使用FastAPI,但我认为这与此问题无关。
2条答案
按热度按时间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在处理请求时依靠操作系统提供所有负载平衡。
其他读数
798qvoo82#
在我的例子中(也使用FastAPI),我发现它以循环调度开始,然后在所有工作者都满了之后就变得愚蠢了。
示例:
我正在尝试修复上面提到的92个请求的低效行为。到目前为止还没有成功。
希望其他人能加入他们的见解?