独角兽工人和线

至于 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个连接并行处理。有了 Async,我最多可以拥有2000个异步,还有一些异步附带的警告。

问题

  • 那么线程在哪里? 我可以添加线程的同步和 异步工作者类型?
  • 围绕枪角兽工人的最佳选择是什么? 我是否应该将 Gunicorn 放在 Django API 的前面,并使用 并行处理100个请求的要求?
  • Gevent 和 sync 工作类线程安全吗?
85997 次浏览

让我试着回答。让我们假设一开始我的部署只有一个枪角兽工人。这使我一次只能处理一个请求。我的工作人员的工作就是给 google.com 打个电话,得到一个查询的搜索结果。现在我要增加吞吐量。我有以下选择:

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

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

为了回答这个问题,假设我需要对 google 返回的搜索结果做一些工作。例如,我可能还想为每个结果查询计算一个素数。现在我将我的工作负载计算限制在一定范围内,并使用 python 的 GIL 解决了这个问题。尽管我有4个线程,但实际上每次只有一个线程可以处理结果。这意味着要获得真正的并行性能,我需要不止一个工人。

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

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

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

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

将辅助类型更改为异步

我为什么要这么做?要回答这个问题,请记住,即使是线程也会消耗内存。Gevent 库实现了一些协程(一种可以查找的基本结构) ,允许您在不创建线程的情况下获取线程。因此,如果你制作你的枪独角兽使用工人类型的 gevent,你得到的好处不必创建线程在您的工人。假设您获得的线程必须显式地创建它们。

因此,为了回答您的问题,如果您使用的是 worker _ type,而不是 Sync,那么您不需要增加 Gunicorn 配置中的线程数量。你当然可以这么做,但这有点违背初衷。

希望这个有帮助。

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

  • 不,Async 辅助类没有线程化选项。 这实际上需要通过文档进一步说明。 想知道为什么没有发生这种情况。

  • 这是一个需要你具体知识更多的问题 如果处理这100个并行请求 只涉及到 I/O 类的操作,比如从数据库获取、保存、, 从其他应用程序收集数据,然后可以利用 但是,如果情况并非如此,并且您希望 在 n 个核心 CPU 上执行,因为这些任务是非常计算性的 就像计算素数一样,你需要使用 异步的原因稍有不同 异步,您需要确保您的处理不受计算约束, 这意味着您将无法使用多个核心。 这样做的好处是,多个线程将占用内存 不会在那里。但你有其他问题,像非猴子补丁 仅当线程工作程序不满足时才移动到异步 你的要求。

  • 同步,如果您想要绝对的,非线程工作线程是最好的选择 在你的库中实现线程安全。