热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

gevnet、gunicorn部署flask

gevent、gunicorn部署Flask服务​flask作为一个轻量级的框架简直不要方便!fromflaskimportFlaskappFlask(__na

gevent、gunicorn部署Flask服务

flask作为一个轻量级的框架简直不要方便!

from flask import Flaskapp = Flask(__name__)@app.route('/')
def hello_world():time.sleep(10)return 'Hello World!'@app.route('/index')
def beijing():return 'Beijing'
if __name__ == '__main__':app.run(host='0.0.0.0', port=5001,threaded=False)#app.run(host='0.0.0.0', port=5001)

网上很多说flask只能是同步不支持并发,感觉很坑呀,app.run这里的threaded参数,经过我的测试,默认其实是True,对多个服务其实会开启多个线程来处理.

1、使用threaded=False时候

用浏览器先后访问127.0.0.1:5001和127.0.0.1:5001/index时,index路由确实要等’/'路由运行才出来,说明False的时候是同步的,两次服务是串行的,这个时候不支持并发

2、threaded=True或者不写threaded参数

用浏览器先后访问127.0.0.1:5001和127.0.0.1:5001/index时,index立马出来,说明是并发的,这里有个坑,注意一下,就是用浏览器同时访问127.0.0.1:5001,这个时候是无法并发的,这里我怀疑了好几天,为啥同一个路由就不并发,后来发现时浏览器的坑,可以用别的 测试工具试试,其实是并发,只不过相同的参数和url浏览器会将这两个请求作为一个请求所以是串行的。不放心可以这样试试,将’/'路由的函数修改GET并传入参数。

@app.route('/')
def hello_world():para = request.args.get("time", type=int)time.sleep(para)return 'Hello World!'

用浏览器访问127.0.0.1:5001?time=10和127.0.0.1:5001?time=9,你会发现这个时候同时返回结果,所以说,flask自身是并发的框架,可以用多线程实现。

flask开发速度快,但是自带的WSGI服务器性能极弱,尤其在压力测试,空接口一千并发都无法通过,百分之4.9无法通过。

image-20210325101858433

接下来我们用gunicorn+gevent的方式部署,其中Genvent库是接收http request时,开启新的协程处理,避免开启线程频繁开销。Flask内置web服务器是单个 Worker,只有一个进程在跑所有的请求,内置 webserver 很容易卡死,并且只有一个 Worker 在跑请求,在多核 CPU 下,仅仅占用一核,Gunicorn 可以调节 Worker 的数量(多个线程)并管理,一个 master 进程管理多个 worker 进程,所有请求和响应均由 Worker 处理,Master 进程是一个简单的 loop, 监听 worker 不同进程信号并且作出响应。比如接受到 TTIN 提升 worker 数量,TTOU 降低运行 Worker 数量。如果 worker 挂了,则重启失败的 worker, 同步的 Worker 一次处理一个请求。

具体部署流程如下,安装gevent和gunicorn,直接用pip install gevent gunicorn即可,安装完后,增加一个gun.py文件在你的app路径下,内容如下,可以根据需求增加一些其他参数

import multiprocessing
backlog = 8192
workers = multiprocessing.cpu_count()*2+1
worker_class = "gevent" #使用gevent模式,开启多协程
bind = "0.0.0.0:5001"
worker_connections = 2000

最后直接使用以下命令部署即可,不需要再启动原来的服务,只用gunicorn启动就行,第一个app表示你flask服务的文件名,第二个表示你服务中应用的app的变量名,这个两个名称一致而已,可以根据自己需求命名。

gunicorn -c gun.py app:app

最后压力测试结果如下,1000并发,loop10次,大幅度提高,但是这个也是吃了不少内存资源的和cpu资源的。

image-20210325104047498


推荐阅读
  • 本文介绍了计算机网络的定义和通信流程,包括客户端编译文件、二进制转换、三层路由设备等。同时,还介绍了计算机网络中常用的关键词,如MAC地址和IP地址。 ... [详细]
  • 本文介绍了Python高级网络编程及TCP/IP协议簇的OSI七层模型。首先简单介绍了七层模型的各层及其封装解封装过程。然后讨论了程序开发中涉及到的网络通信内容,主要包括TCP协议、UDP协议和IPV4协议。最后还介绍了socket编程、聊天socket实现、远程执行命令、上传文件、socketserver及其源码分析等相关内容。 ... [详细]
  • Nginx使用(server参数配置)
    本文介绍了Nginx的使用,重点讲解了server参数配置,包括端口号、主机名、根目录等内容。同时,还介绍了Nginx的反向代理功能。 ... [详细]
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • 如何在服务器主机上实现文件共享的方法和工具
    本文介绍了在服务器主机上实现文件共享的方法和工具,包括Linux主机和Windows主机的文件传输方式,Web运维和FTP/SFTP客户端运维两种方式,以及使用WinSCP工具将文件上传至Linux云服务器的操作方法。此外,还介绍了在迁移过程中需要安装迁移Agent并输入目的端服务器所在华为云的AK/SK,以及主机迁移服务会收集的源端服务器信息。 ... [详细]
  • 本文讨论了在openwrt-17.01版本中,mt7628设备上初始化启动时eth0的mac地址总是随机生成的问题。每次随机生成的eth0的mac地址都会写到/sys/class/net/eth0/address目录下,而openwrt-17.01原版的SDK会根据随机生成的eth0的mac地址再生成eth0.1、eth0.2等,生成后的mac地址会保存在/etc/config/network下。 ... [详细]
  • 搭建Windows Server 2012 R2 IIS8.5+PHP(FastCGI)+MySQL环境的详细步骤
    本文详细介绍了搭建Windows Server 2012 R2 IIS8.5+PHP(FastCGI)+MySQL环境的步骤,包括环境说明、相关软件下载的地址以及所需的插件下载地址。 ... [详细]
  • 本文介绍了Hyperledger Fabric外部链码构建与运行的相关知识,包括在Hyperledger Fabric 2.0版本之前链码构建和运行的困难性,外部构建模式的实现原理以及外部构建和运行API的使用方法。通过本文的介绍,读者可以了解到如何利用外部构建和运行的方式来实现链码的构建和运行,并且不再受限于特定的语言和部署环境。 ... [详细]
  • 图解redis的持久化存储机制RDB和AOF的原理和优缺点
    本文通过图解的方式介绍了redis的持久化存储机制RDB和AOF的原理和优缺点。RDB是将redis内存中的数据保存为快照文件,恢复速度较快但不支持拉链式快照。AOF是将操作日志保存到磁盘,实时存储数据但恢复速度较慢。文章详细分析了两种机制的优缺点,帮助读者更好地理解redis的持久化存储策略。 ... [详细]
  • http:my.oschina.netleejun2005blog136820刚看到群里又有同学在说HTTP协议下的Get请求参数长度是有大小限制的,最大不能超过XX ... [详细]
  • 本文介绍了为什么要使用多进程处理TCP服务端,多进程的好处包括可靠性高和处理大量数据时速度快。然而,多进程不能共享进程空间,因此有一些变量不能共享。文章还提供了使用多进程实现TCP服务端的代码,并对代码进行了详细注释。 ... [详细]
  • 本文介绍了如何使用iptables添加非对称的NAT规则段,以实现内网穿透和端口转发的功能。通过查阅相关文章,得出了解决方案,即当匹配的端口在映射端口的区间内时,可以成功进行端口转发。详细的操作步骤和命令示例也在文章中给出。 ... [详细]
  • 本文介绍了Web学习历程记录中关于Tomcat的基本概念和配置。首先解释了Web静态Web资源和动态Web资源的概念,以及C/S架构和B/S架构的区别。然后介绍了常见的Web服务器,包括Weblogic、WebSphere和Tomcat。接着详细讲解了Tomcat的虚拟主机、web应用和虚拟路径映射的概念和配置过程。最后简要介绍了http协议的作用。本文内容详实,适合初学者了解Tomcat的基础知识。 ... [详细]
  • 本文介绍了通过ABAP开发往外网发邮件的需求,并提供了配置和代码整理的资料。其中包括了配置SAP邮件服务器的步骤和ABAP写发送邮件代码的过程。通过RZ10配置参数和icm/server_port_1的设定,可以实现向Sap User和外部邮件发送邮件的功能。希望对需要的开发人员有帮助。摘要长度:184字。 ... [详细]
  • Linux如何安装Mongodb的详细步骤和注意事项
    本文介绍了Linux如何安装Mongodb的详细步骤和注意事项,同时介绍了Mongodb的特点和优势。Mongodb是一个开源的数据库,适用于各种规模的企业和各类应用程序。它具有灵活的数据模式和高性能的数据读写操作,能够提高企业的敏捷性和可扩展性。文章还提供了Mongodb的下载安装包地址。 ... [详细]
author-avatar
陈智伟569993
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有