1、gunicorn + flask 处理高并发请求介绍

一,独角兽Gunicorn 服务器作为wsgi app的容器, 采用 pre-fork 模型中有一个管理进程以及几个的工作进程。master 管理多个 slave 进程创建slave进程,监听事件:1, 根据定义的 work数量 创建多个 work 进程2, 在worker.init_process()函数中,每个woker子进程都会单独去实例化我们的wsgi app对象。针对多进程,一个进程实例化一个 app 对象,多线程,一个线程处理实例化app对象,协程根据server对象3, 然后,worker和master各自进入自己的消息循环。 master的事件循环就是收收信号,管理管理worker进程,而worker进程的事件循环就是监听网络事件并处理(如新建连接,断开连接,处理请求发送响应等等),真正的连接最终是连到了worker进程上的# 创建 固定数量的 worker(由 manager 进行维护)def manage_workers(self):if len(self.WORKERS.keys()) < self.num_workers:self.spawn_workers()while len(workers) > self.num_workers:(pid, _) = workers.pop(0)self.kill_worker(pid, signal.SIGQUIT)# 创建 work 进程def spawn_worker(self):self.worker_age += 1#创建worker。请注意这里的app 对象并不是真正的wsgi app对象,而是gunicorn的app#对象。gunicorn的app对象负责import我们自己写的wsgi app对象。worker = self.worker_class(self.worker_age, self.pid, self.LISTENERS,self.app, self.timeout / 2.0,self.cfg, self.log)# pid = 0 表示子进程pid = os.fork()#父进程,返回后继续创建其他worker,没worker后进入到自己的消息循环if pid != 0:# 父进程记录子进程self.WORKERS[pid] = workerreturn pid# 子进程继续运行# Process Childworker_pid = os.getpid()try:..........worker.init_process() #子进程,初始化woker,进入worker的消息循环,sys.exit(0)except SystemExit:raise............
二,  Gunicorn 几种启动方式 sync (默认值) eventlet gevent tornadoIO 受限 -建议使用gevent或者asyncioCPU受限 -建议增加workers数量不确定内存占用? -建议使用gthread
       # gunicorn 启动4个进程(默认启动方式),每个 work 单线程 并发量 4*1gunicorn -w 4 -b 0.0.0.0:8000 demo:app# gunicorn 允许每个worker拥有多个线程  并发量 = 4*2gunicorn -w 4 --thread=2 --worker-class=gthread main:app# gunicorn  伪线程 gevent (协程) 并发量 3*1000gunicorn --worker-class=gevent --worker-connections=1000 -w 3 main:app
三, web 异步任务实现方式:1, web 的多并发 并不是有 flask 来实现的, flask 只是负责根据Request产生Response(一个python程序),多并发是由 WSGI server是通过进程(pre-fork)来并发的。这样并发就取决与进程数,如果WSGI server用了gevent,eventlet等 green thread技术,就可以支持更多并发2, 针对 work 启动方式  gevent每个ggevent worker启动的时候会启动多个server对象,worker首先为每个listener创建一个server对象,每个server对象都有运行在一个单独的gevent pool对象中。真正等待链接和处理链接的操作是在server对象中进行的3,WSGIServer 实际上是创建一个协程去处理该套接字,也就是说在WSGIServer 中,一个协程单独负责一个HTTP链接。协程中运行的self._handle函数实际上是调用了WSGIHandler的handle函数来不断处理http 请求4,gunicorn 会启动一组 worker进程,所有worker进程公用一组listener,在每个worker中为每个listener建立一个wsgi server。每当有HTTP链接到来时,wsgi server创建一个协程来处理该链接,协程处理该链接的时候,先初始化WSGI环境,然后调用用户提供的app对象去处理HTTP请求(处理http请求可以理解为一个程序)。
#为每个listener创建server对象。for s in self.sockets:pool = Pool(self.worker_connections) #创建gevent poolif self.server_class is not None:#创建server对象server = self.server_class(s, application=self.wsgi, spawn=pool, log=self.log,handler_class=self.wsgi_handler, **ssl_args).............server.start() #启动server,开始等待链接,服务链接servers.append(server).........
  在handle函数的循环内部,handle_one_request函数首先读取HTTP 请求,初始化WSGI环境,然后最终调用run_application函数来处理请求
    def run_application(self):self.result = self.application(self.environ, self.start_response)self.process_result()

.

2、gunicorn flask的请求流程

当运行gunicorn这个命令启动flask的时候

首先回去调用gunicorn/app/wsgiapp中的run方法

回去调用run()方法,这个run方式本质是gunicorn/arbiter中的run()方法

主要就关注其中manage_workers()方法

很明显调用了spawn_workers()方法,这个方式只是遍历了spawn_worker()。因此我们直接看spawn_worker()方法


可以发现 初始化了一个workclass,这个worker是gunicorn/workers/sync。为什么是使用这个因为在gunicorn/config中的worker_class默认使用的SyncWorker

好了接下来我们说一下worker,这些worker本质上都是为了处理一个一个request的

看到respiter = self.wsgi(environ, resp.start_response)这个了吗,这就是gunicorn符合wsgi的内涵。这个吧当前的环境和一个response传进去,当然传出了的也是response。

我们看看这个方法是那里呢?

寻找了一下是在生成worker的时候传入的app中获取的。

那么我们来看一下这个app到底是什么东西,在gunicorn中的Arbiter初始化函数中有一句

这个app本质就是从外部初始化传进来的,寻找这个类常初始化的地方gunicorn/app/base中

感情把自己的实例传进去了,不过在这里也找到了wsgi()方法

这个load()方法是子类gunicorn/app/wsgiapp中实现的

最后看一下load_wsgiapp()

他的意思就是把你在命令中的app实例导入。这里最后提一下在flask中的实现,这个是FLASK类在flask/app.py中


因为这个类实现了__call__方法所以使用实例传入参数以后就来到了flask框架进行request处理。

————————————————
参考:https://blog.csdn.net/yj1499945/article/details/79040099

【Gunicorn】gunicorn + flask 请求流程 及 高并发处理介绍相关推荐

  1. redis 关系数据库怎么转换 和_redis高并发处理介绍

    Redis的高并发和快速原因 1.Redis是基于内存的,内存的读写速度非常快: 2.Redis是单线程的,省去了很多上下文切换线程的时间: 3.Redis使用多路复用技术,可以处理并发的连接.非阻塞 ...

  2. Gunicorn部署Flask

    Gunicorn是一个被广泛使用的高性能的Python WSGI UNIX HTTP服务组件(WSGI: Web Server Gateway Interface),移植自Ruby的独角兽(Unico ...

  3. 使用 Nginx + Gunicorn 部署 Flask 项目

    使用 Nginx + Gunicorn 部署 Flask 项目 Flask Web 项目开发完成后,开发人员只是在开发环境运行,只有本地可以访问到项目.如果要让用户访问到项目,需要将项目部署到生产环境 ...

  4. python supervisor flask_python web 部署:nginx + gunicorn + supervisor + flask 部署笔记

    分享一篇文章,原文来自:python web 部署. Python web 部署 web开发中,各种语言争奇斗艳,web的部署方面,却没有太多的方式.简单而已,大概都是 nginx 做前端代理,中间 ...

  5. 利用flask写的接口(base64, 二进制, 上传视频流)+异步+gunicorn部署Flask服务+多gpu卡部署

    一.flask写的接口 1.1 manage.py启动服务(发送图片base64版) 这里要注意的是用docker的话,记得端口映射 #coding:utf-8 import base64 impor ...

  6. Okhttp3-网络请求流程解析

    前言 已经大火2年的Retrofit,必然会提到另外两个库,OKhttp3和Rxjava,尤其前者,作为Retrofit网络请求的底层库,我们有必要了解OKhttp3的网络请求是如何运作的,就会理解为 ...

  7. php redis 高并发队列,laravel+Redis简单实现队列通过压力测试的高并发处理

    这篇文章主要介绍了关于laravel+Redis简单实现队列通过压力测试的高并发处理 ,有着一定的参考价值,现在分享给大家,有需要的朋友可以参考一下 秒杀活动 在一般的网络商城中我们会经常接触到一些高 ...

  8. flask 多进程/多线程 解决高并发问题

    1.简介: Flask 默认是单进程,单线程阻塞的任务模式,在项目上线的时候可以通过nginx+gunicorn 的方式部署flask任务. app.run()中可以接受两个参数,分别是threade ...

  9. 伏威谈淘宝网的高并发处理与压力测试(转)

     其实到现在为止距离淘宝双十一事件已经过去蛮多天了,但在整个技术圈里面大家还是津津乐道.我这次在采访之前在和一些网友做沟通的时候,他们也提出了非常多非常有意思的问题,包括一些高并发的,一些压力测试的等 ...

最新文章

  1. 转载:vs2010 问题 LINK : fatal error LNK1123: 转换到 COFF 期间失败: 文件无效或损坏
  2. 【C 语言】文件操作 ( 文件结尾判定 )
  3. 口语学习Day6:今天聊聊国内安全还是国外安全?
  4. MySQL与会计报表_会计报表的18项必须审核的数据
  5. dubbo 常见错误
  6. 使用canvas绘制小程序码
  7. 张量的通俗理解和计算
  8. Duplicate property mapping of contactPhone found in
  9. 【codeforces】【比赛题解】#872 CF Round #440 (Div.2)
  10. 【转】成为一名推荐系统工程师永远都不晚
  11. UltraEdit-32 温馨提示:右协会,取消 bak文件
  12. c++实现八大排序算法
  13. Navicat 数据库可视化工具远程连接MySQL及基本操作
  14. 日常笔记-snownlp情感分析计算情感得分
  15. KNY三人组对YiSmile小程序的项目总结
  16. 非平凡的函数依赖、平凡函数依赖
  17. adb检测不到模拟器的解决方法
  18. stm32语音识别文字显示_『免费开源』基于STM32的之语音识别
  19. 团队作业1——团队展示
  20. Hive错误之 Execution Error, return code 2 from org.apache.hadoop.hive.ql.exec.mr.MapRedTask错误分析

热门文章

  1. 请替费城球迷好好照顾艾弗森
  2. 选择安防监控系统镜头时需注意各种…
  3. 上海通运推出上海至大阪/神户的高速轮渡货运服务“关西特快”
  4. 架构实战:架构设计文档模板
  5. 苹果cmsv8好看的蓝色自适应免费影视模板
  6. 评论:个人信息泄露,期待法律有效堵漏
  7. iOS Core Data 数据迁移 指南 144 作者 一缕殇流化隐半边冰霜 关注 2016.05.09 00:35* 字数 4718 阅读 2931评论 17喜欢 327 前言 Core
  8. Conda channels配置
  9. Ubuntu16.04及以上安装TIM、微信、QQ步骤【基于deepin_wine,目前最优雅稳定的方案】
  10. Flutter入门:开发环境与开发工具的准备