Gunicorn工人和线程

Ric*_*ckD 39 gunicorn

就Gunicorn而言,我知道有各种工人类,但对于这个对话,我只是在看同步和异步类型.

从我的理解......

sync
workers = (2 * cpu) + 1
worker_class = sync

async (gevent)
workers = 1
worker_class = gevent
worker_connections = a value (lets say 2000)
Run Code Online (Sandbox Code Playgroud)

因此(基于4核系统)使用同步工作器我可以并行处理最多9个连接.使用Async,我可以拥有高达2000,同时带有异步的警告.

问题

  • 那么线程适合哪里?我可以为同步和异步工作者类型添加线程吗?
  • gunicorn工人的最佳选择是什么?我是否希望将gunicorn放在Django API前面,并要求并行处理100个请求?
  • gevent和同步工作者类是否安全?

abh*_*Dad 75

让我尝试一下答案.让我们假设在开始时我的部署只有一名炮手工人.这允许我一次只处理一个请求.我的工作人员的工作只是打电话给google.com并获取查询的搜索结果.现在我想提高吞吐量.我有以下选项

仅保留一名工作人员并增加该工作人员的线程数

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

要回答这个问题,假设我需要对google返回的搜索结果进行一些处理.例如,我可能还想为每个结果查询计算素数.现在我正在使我的工作负载计算受限,我用python的全局解释器锁来解决问题.即使我有4个线程,但一次只能有一个线程实际处理结果.这意味着要获得真正的并行性能,我需要多个工作人员.

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

那么为什么我需要这个就是我需要真正的并行处理.每个工作人员都可以并行拨打google.com,获取结果并进行任何处理.全部并行.太棒了.但缺点是流程越来越重,我的系统可能无法满足增加员工以实现并行性的要求.因此,最好的解决方案是增加工作人员并为每个工作人员添加更多线程.

增加工人数量,每个工人都是多线程的

我想这不需要进一步解释.

将工作器类型更改为Async

现在我为什么要这样做?要回答,请记住,即使线程消耗内存.有geventine(你可以查找的一个基本结构),由gevent库实现,允许你在不必创建线程的情况下获取线程.因此,如果你制作你的gunicorn使用工人类型的gevent,你可以获得不必在你的工人中创建线程的好处.假设您正在获取线程而无需显式创建它们.

因此,要回答您的问题,如果您使用的工作类型不同于Sync,则无需增加gunicorn配置中的线程数.你可以通过各种方式做到这一点,但它有点挫败了目的.

希望这有帮助.

我也会尝试回答具体问题.

  • 不,Async worker类不存在线程选项.这实际上需要通过文档更清楚.想知道为什么没有发生这种情况.

  • 这是一个需要更多了解您的具体应用的问题.如果处理这100个并行请求只涉及I/O类操作,比如从DB中获取,保存,从其他应用程序中收集数据,那么您可以使用线程化工作程序.但如果情况并非如此,并且您希望在核心CPU上执行,因为任务非常受计算限制,可能就像计算素数一样,您需要使用同步工作程序.异步的原因略有不同.要使用Async,您需要确保您的处理不受计算限制,这意味着您将无法使用多个核心.你得到的好处是多线程将占用的内存不会存在.但是您还有其他问题,例如非猴子修补库.仅当线程工作者不符合您的要求时才移至Async.

  • 如果您希望库中的绝对线程安全,则同步,非线程工作程序是最佳选择.

  • 将自己置于可能决定这样做的人的角度,我会害怕哪些模块可能无法正确修补猴子,以便在使用Async worker类时可预测地工作.异步的所有好处确实伴随着自身的风险.您必须确保所有代码都经过猴子修补并且没有本机代码运行.所以这种风险会阻止我总是去Async. (4认同)
  • 原始响应意味着您可以使用具有多个线程的默认同步 Gunicorn Worker。我对此感到困惑。根据gunicorn文档,“--threads”设置仅影响“gthread”工作线程类型,他们说它使用事件循环,因此它是一个异步工作线程。据我所知,gunicorn 中不能有“多线程同步”工作人员。它是否正确? (3认同)
  • 很好的答案。我仍然不清楚这一点,为什么/如何对库进行猴子修补,以及是否有某种方法可以检查它们是否是? (2认同)
  • 与非线程工作人员相比,线程工作人员是否会带来线程安全错误的重大风险?是否需要为同步线程工作程序对库进行猴子修补? (2认同)