首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Gunicorn工人和线程

Gunicorn工人和线程
EN

Stack Overflow用户
提问于 2016-07-17 20:24:57
回答 1查看 85.6K关注 0票数 137

就Gunicorn而言,我知道有各种各样的工作类,但在这段对话中,我只看同步和异步类型。

据我理解..。

代码语言:javascript
复制
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,以及异步附带的注意事项。

问题

  • 那么线程在哪里呢?我可以将线程添加到同步和异步工作类型中吗?
  • 什么是最好的选择周围的枪手工人?我是否应该将gunicorn放在Django API的前面,同时处理100多个请求?
  • gevent和同步工作类线程安全吗?
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-01-17 11:57:00

让我试着回答。让我们假设,在开始的时候,我的部署只有一名枪手。这允许我一次只处理一个请求。我的工作人员的工作就是打个电话到google.com并获取查询的搜索结果。现在我想增加我的吞吐量。我有以下选择:

只保留一个工作人员,并增加该工作人员中的线程数。

这是最简单的。由于线程比进程更轻量级(内存消耗更少),所以我只保留一个工作线程,并在其中添加了几个线程。Gunicorn将确保主人可以向工人发送多个请求。由于工作人员是多线程的,所以它能够处理4个请求。太棒了。为什么我需要更多的工人?

要回答这个问题,假设我需要对google返回的搜索结果做一些工作。例如,我可能还想为每个结果查询计算一个素数。现在,我使我的工作负载计算绑定,我遇到了python的全局解释器锁的问题。即使我有4个线程,一次只能处理一个线程。这意味着要获得真正的并行性能,我需要一个以上的工作人员。

增加工人人数,但所有工人都是单线程的

所以我需要这个是因为我需要真正的并行处理。每个工作人员都可以并行地调用google.com,获取结果并执行任何处理。都是平行的太棒了。但缺点是进程更重,我的系统可能无法满足增加工作人员以实现并行性的要求。因此,最好的解决方案是增加工作人员,并向每个工作人员添加更多的线程。

增加工人人数,每个工作人员都是多线程的。

我想这不需要进一步解释了。

将员工类型更改为异步

现在我为什么要这么做?要回答这个问题,请记住,即使线程也会消耗内存。gevent库实现了coroutines (一个可以查找的基本构造),它允许您不需要创建线程就可以获得线程。所以,如果你制作你的工匠型get,你就不用在你的工人中创建线程了。假设您得到线程w/o必须显式地创建它们。

因此,要回答您的问题,如果您使用的是worker_type之外的任何同步,您不需要增加线程的数量在您的古尼科恩配置。你当然可以做到,但这有点违背了目的。

希望这能帮上忙。

我也会尝试回答具体的问题。

  • 不,异步工作者类不存在线程选项。这实际上需要通过文档来更清楚地说明。不知道为什么没有发生这种事。
  • 这是一个需要对您的具体应用程序有更多了解的问题。如果这100多个并行请求的处理只是涉及I/O类型的操作,比如从DB获取、保存、从其他应用程序收集数据,那么您可以使用线程工作人员。但是,如果情况并非如此,并且您希望在n个核心CPU上执行,因为这些任务具有极大的计算范围,可能就像计算素数一样,您需要使用Sync worker。异步的推理略有不同。要使用异步,您需要确保您的处理不受计算限制,这意味着您将无法使用多核。您得到的优势是,多个线程将占用的内存将不存在。但您还有其他问题,如非猴子补丁库。只有当线程工作人员不满足您的要求时,才移动到异步。
  • 如果您想要库中的绝对线程安全,同步、非线程工作人员是最好的选择。
票数 270
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38425620

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档