让我尝试一个答案。让我们假设在开始时我的部署只有一个gunicorn工人。这使我一次只能处理一个请求。我的工作人员只是打电话给google.com并获取查询的搜索结果。现在,我想增加吞吐量。我有以下选择
只保留一个工作线程,并增加该工作线程中的线程数
这是最简单的。由于线程比进程更轻量(更少的内存消耗),因此我只保留一个工作进程并向其中添加多个线程。Gunicorn将确保主服务器可以向工作人员发送多个请求。由于工作线程是多线程的,因此它能够处理4个请求。太棒了 现在为什么我需要更多的工人?
为了回答这个问题,假设我需要对Google返回的搜索结果做一些工作。例如,我可能还想为每个结果查询计算素数。现在,我正在限制工作负载计算,并且遇到了python的全局解释器锁定的问题。即使我有4个线程,一次实际上也只能有一个线程处理结果。这意味着要获得真正的并行性能,我需要多个工作人员。
增加工人数量,但所有工人均为单线程
因此,当我需要获得真正的并行处理时,为什么需要这样做。每个工作人员都可以并行调用google.com,获取结果并进行任何处理。全部并行。太棒了 但是缺点是流程更加繁重,而且我的系统可能无法满足增加工人完成并行性的需求。因此,最好的解决方案是增加工作人员,并为每个工作人员添加更多线程。
增加工人数,每个工人都是多线程的
我想这不需要进一步解释。
将工作程序类型更改为异步
现在为什么我要这样做?要回答,请记住,即使线程也占用内存。gevent库实现了一些协程(您可以查找的基本构造),这些协程使您无需创建线程即可获取线程。因此,如果您制作出可以使用工作者类型的gevent的Gunicorn,那么您将不必在工作者中创建线程。假设您正在获得没有显式创建线程的线程。
因此,要回答您的问题,如果您使用的是不是Sync的worker_type,则无需增加gunicorn配置中的线程数。您一定可以做到,但这有点违背了目的。
希望这会有所帮助。
我还将尝试回答具体问题。
不,异步工作器类不存在线程化选项。实际上,这需要通过文档来弄清楚。想知道为什么没有发生。
这是一个需要您对特定应用程序有更多了解的问题。如果处理这100个并行请求仅涉及I / O类操作,例如从数据库中获取数据,保存数据,从其他应用程序收集数据,那么您可以利用线程工作程序。但是,如果不是这种情况,并且您想在核心CPU上执行,因为任务是非常受计算限制的,例如像计算素数一样,您需要使用Sync worker。异步的原因略有不同。要使用异步,您需要确保您的处理不受计算限制,这意味着您将无法使用多个内核。您得到的好处是不会有多个线程占用的内存。但是您还有其他问题,例如非猴子补丁库。
如果您要在库中实现绝对线程安全,那么同步非线程工作程序是最佳选择。