Gunicorn Worker(进程) Thread (线程)配置建议

什么时候需要多进程,什么时候需要多线程?

线程比进程更轻量级(更少的内存消耗),一worker,多线程,Gunicorn就能同时接收多个请求。 也由于worker是多线程的,所以它能同时处理N个请求。 既然这样,为什么我需要更多的worker?

要回答这个问题,假设我需要对百度返回的搜索结果做一些工作。 例如,我可能还想为每个结果查询计算一个质数。 现在我正在计算我的工作负载,我碰到了python的全局解释器锁的问题。 即使我有N个线程,一次也只有一个线程可以处理结果。 这意味着要获得真正的并行性能,我需要不止一个worker。

所以,问题的答案就在乎你要运行怎么样的程序,如果比较轻量级的应用,简单处理增删改查并且不会出现全局锁的需求时,那么你可以设置一个worker(进程),并设置多个threads(线程),也可以使用gevernt来设置(下面会提及). 但是,如果你的应该要处理比较复杂的计算,那么你可以设置多个进程。

官方建议worker数量为: (2 x $num_cores) + 1

使用gevernt将worker类型更改为Async(异步)

什么要这么做? 要回答这个问题,请记住即使是线程也会消耗内存的。 gevent库实现了协程,它允许您无需创建线程就可以获得线程。 因此,如果您使用gevent的worker类型来制作gunicorn,您将获得无需在worker中创建线程。

async (gevent)
workers = 1
worker_class = gevent
  • Async worker(异步worker) 类中没有线程选项,定义了也不会有什么效果。 可查看官方文档获取更多信息。
  • 如果处理的100个并行请求只涉及I/O操作,比如从DB中获取、保存、从其他应用程序中收集数据,那么您可以使用gevernt实现多线程单进程。 但是,如果情况并非如此,而您希望在n核CPU上执行任务,因为这些任务是消耗计算资源的,比如计算质数,那么您就需要使用Sync worker(同步进程)。
  • 如果你想在库中实现绝对线程安全,那么同步、非线程工作器反而最好的选择。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值