独角兽工人和线程


72

就Gunicorn而言,我知道有各种各样的worker类,但是对于本次对话,我只是关注sync和async类型。

据我了解...

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

async (gevent)
workers = 1
worker_class = gevent
worker_connections = a value (lets say 2000)

因此(基于4核系统),使用同步工作程序,我最多可以并行处理9个连接。有了Async,我最多可以拥有2000,并且附带了异步警告。

问题

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

Answers:


136

让我尝试一个答案。让我们假设在开始时我的部署只有一个gunicorn工人。这使我一次只能处理一个请求。我的工作人员只是打电话给google.com并获取查询的搜索结果。现在,我想增加吞吐量。我有以下选择

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

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

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

增加工人数量,但所有工人均为单线程

因此,当我需要获得真正的并行处理时,为什么需要这样做。每个工作人员都可以并行调用google.com,获取结果并进行任何处理。全部并行。太棒了 但是缺点是流程更加繁重,而且我的系统可能无法满足增加工人完成并行性的需求。因此,最好的解决方案是增加工作人员,并为每个工作人员添加更多线程。

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

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

将工作程序类型更改为异步

现在为什么我要这样做?要回答,请记住,即使线程也占用内存。gevent库实现了一些协程(您可以查找的基本构造),这些协程使您无需创建线程即可获取线程。因此,如果您制作出可以使用工作者类型的gevent的Gunicorn,那么您将不必在工作者中创建线程。假设您正在获得没有显式创建线程的线程。

因此,要回答您的问题,如果您使用的是不是Sync的worker_type,则无需增加gunicorn配置中的线程数。您一定可以做到,但这有点违背了目的。

希望这会有所帮助。

我还将尝试回答具体问题。

  • 不,异步工作器类不存在线程化选项。实际上,这需要通过文档来弄清楚。想知道为什么没有发生。

  • 这是一个需要您对特定应用程序有更多了解的问题。如果处理这100个并行请求仅涉及I / O类操作,例如从数据库中获取数据,保存数据,从其他应用程序收集数据,那么您可以利用线程工作程序。但是,如果不是这种情况,并且您想在核心CPU上执行,因为任务是非常受计算限制的,例如像计算素数一样,您需要使用Sync worker。异步的原因略有不同。要使用异步,您需要确保您的处理不受计算限制,这意味着您将无法使用多个内核。您得到的好处是不会有多个线程占用的内存。但是您还有其他问题,例如非猴子补丁库。

  • 如果您要在库中实现绝对线程安全,那么同步非线程工作程序是最佳选择。


但是由于GIL的原因,即使计算受限制,也不总是运行异步。线程安全性已经得到保证。
garg10may

5
将自己放在可能决定执行此操作的人的鞋子上,我会担心使用猴异步类无法正确修补哪些模块才能正常工作。异步带来的所有好处的确有其自身的风险。您必须绝对确保所有代码都是猴子补丁,并且不会运行任何本机代码。因此,这种风险将阻止我始终进行异步处理。
abhayAndPoorvisDad

1
好答案。我仍然不清楚,为什么/如何修补库以及是否有某种方法可以检查它们是否是猴子?
Paolo

1
与非线程工作者相比,线程工作者是否会带来线程安全错误的重大风险?同步线程工作者是否需要为猴子打补丁?
安东尼·马蒂沃斯
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.