就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,同时带有异步的警告.
问题
abh*_*Dad 75
让我尝试一下答案.让我们假设在开始时我的部署只有一名炮手工人.这允许我一次只处理一个请求.我的工作人员的工作只是打电话给google.com并获取查询的搜索结果.现在我想提高吞吐量.我有以下选项
这是最简单的.由于线程比进程更轻量级(更少的内存消耗),我只保留一个worker并添加几个线程.Gunicorn将确保主人可以向工人发送多个请求.由于worker是多线程的,因此能够处理4个请求.太棒了.现在为什么我需要更多的工人呢?
要回答这个问题,假设我需要对google返回的搜索结果进行一些处理.例如,我可能还想为每个结果查询计算素数.现在我正在使我的工作负载计算受限,我用python的全局解释器锁来解决问题.即使我有4个线程,但一次只能有一个线程实际处理结果.这意味着要获得真正的并行性能,我需要多个工作人员.
那么为什么我需要这个就是我需要真正的并行处理.每个工作人员都可以并行拨打google.com,获取结果并进行任何处理.全部并行.太棒了.但缺点是流程越来越重,我的系统可能无法满足增加员工以实现并行性的要求.因此,最好的解决方案是增加工作人员并为每个工作人员添加更多线程.
我想这不需要进一步解释.
现在我为什么要这样做?要回答,请记住,即使线程消耗内存.有geventine(你可以查找的一个基本结构),由gevent库实现,允许你在不必创建线程的情况下获取线程.因此,如果你制作你的gunicorn使用工人类型的gevent,你可以获得不必在你的工人中创建线程的好处.假设您正在获取线程而无需显式创建它们.
因此,要回答您的问题,如果您使用的工作类型不同于Sync,则无需增加gunicorn配置中的线程数.你可以通过各种方式做到这一点,但它有点挫败了目的.
希望这有帮助.
我也会尝试回答具体问题.
不,Async worker类不存在线程选项.这实际上需要通过文档更清楚.想知道为什么没有发生这种情况.
这是一个需要更多了解您的具体应用的问题.如果处理这100个并行请求只涉及I/O类操作,比如从DB中获取,保存,从其他应用程序中收集数据,那么您可以使用线程化工作程序.但如果情况并非如此,并且您希望在核心CPU上执行,因为任务非常受计算限制,可能就像计算素数一样,您需要使用同步工作程序.异步的原因略有不同.要使用Async,您需要确保您的处理不受计算限制,这意味着您将无法使用多个核心.你得到的好处是多线程将占用的内存不会存在.但是您还有其他问题,例如非猴子修补库.仅当线程工作者不符合您的要求时才移至Async.
如果您希望库中的绝对线程安全,则同步,非线程工作程序是最佳选择.
| 归档时间: |
|
| 查看次数: |
19546 次 |
| 最近记录: |