就Gunicorn而言,我知道有各种各样的工作类,但在这段对话中,我只看同步和异步类型。
据我理解..。
sync
workers = (2 * cpu) + 1
worker_class = sync
async (gevent)
workers = 1
worker_class = gevent
worker_connections = a value (lets say 2000)因此(基于一个4核心系统),使用同步工作人员,最多可以并行处理9个连接。有了异步,我可以拥有多达2000,以及异步附带的注意事项。
问题
发布于 2017-01-17 11:57:00
让我试着回答。让我们假设,在开始的时候,我的部署只有一名枪手。这允许我一次只处理一个请求。我的工作人员的工作就是打个电话到google.com并获取查询的搜索结果。现在我想增加我的吞吐量。我有以下选择:
只保留一个工作人员,并增加该工作人员中的线程数。
这是最简单的。由于线程比进程更轻量级(内存消耗更少),所以我只保留一个工作线程,并在其中添加了几个线程。Gunicorn将确保主人可以向工人发送多个请求。由于工作人员是多线程的,所以它能够处理4个请求。太棒了。为什么我需要更多的工人?
要回答这个问题,假设我需要对google返回的搜索结果做一些工作。例如,我可能还想为每个结果查询计算一个素数。现在,我使我的工作负载计算绑定,我遇到了python的全局解释器锁的问题。即使我有4个线程,一次只能处理一个线程。这意味着要获得真正的并行性能,我需要一个以上的工作人员。
增加工人人数,但所有工人都是单线程的
所以我需要这个是因为我需要真正的并行处理。每个工作人员都可以并行地调用google.com,获取结果并执行任何处理。都是平行的太棒了。但缺点是进程更重,我的系统可能无法满足增加工作人员以实现并行性的要求。因此,最好的解决方案是增加工作人员,并向每个工作人员添加更多的线程。
增加工人人数,每个工作人员都是多线程的。
我想这不需要进一步解释了。
将员工类型更改为异步
现在我为什么要这么做?要回答这个问题,请记住,即使线程也会消耗内存。gevent库实现了coroutines (一个可以查找的基本构造),它允许您不需要创建线程就可以获得线程。所以,如果你制作你的工匠型get,你就不用在你的工人中创建线程了。假设您得到线程w/o必须显式地创建它们。
因此,要回答您的问题,如果您使用的是worker_type之外的任何同步,您不需要增加线程的数量在您的古尼科恩配置。你当然可以做到,但这有点违背了目的。
希望这能帮上忙。
我也会尝试回答具体的问题。
https://stackoverflow.com/questions/38425620
复制相似问题