python-flask-gunicorn-并发

flask+Gunicorn(gevent)高并发的解决方法探究 1. 协程定义 概念:协程就是协同工作的程序,不是进程也不是线程 理解成–不带返回值的函数调用。 Coroutine:协程,又称微线程,纤程。 协程的这种“挂起”和“唤醒”机制实质上是将一个过程切分成了若干个子过程,给了我们一种以扁平的方式来使用事件回调模型。优点:共享进程的上下文,一个进程可以创建百万,千万的coroutine。 python中的yield和第三方库greenlet,都可以实现协程。 greenlet 提供了在协程中直接切换控制权的方式,比生成器(yield)更加灵活、简洁。 G 阅读详情

使用flask框架进行web开发的时候,默认情况是单一的进程。当出现并发请求,就会出现排队现象。
解决:

  1. 开发环境, threaded=True
    if __name__ == '__main__':
        # 多进程与多线程不能同时开启
        #app.run('0.0.0.0', port=5001, threaded=False, processes=3)  # 适用多进程启动服务
        #app.run('0.0.0.0', port=5001, threaded=True)  # 适用多线程启动服务
    
  2. 生产环境,使用gunicorn部署
    python常见的web部署搭配nginx+gunicorn。

一、gunicorn安装

pip install gunicorn

二、配置参数详解

参考:
1、Gunicorn配置部分的翻译
2、Gunicorn-配置详解
3、python之gunicorn的配置
4、gunicorn官方文档
具体参数如下:

[2019-07-04 19:37:21 +0800] [31677] [DEBUG] Current configuration:
  config: /home/gunicorn/config.py
  bind: ['172.28.171.98:8080']
  backlog: 2048
  workers: 1
  worker_class: sync
  threads: 1
  worker_connections: 1000
  max_requests: 0
  max_requests_jitter: 0
  timeout: 600
  graceful_timeout: 30
  keepalive: 2
  limit_request_line: 4094
  limit_request_fields: 100
  limit_request_field_size: 8190
  reload: True
  reload_engine: auto
  reload_extra_files: []
  spew: False
  check_config: False
  preload_app: False
  sendfile: None
  reuse_port: False
  chdir: /home/260190/PycharmProjects/文档内容修订检测
  daemon: False
  raw_env: []
  pidfile: None
  worker_tmp_dir: None
  user: 1000
  group: 1000
  umask: 0
  initgroups: False
  tmp_upload_dir: None
  secure_scheme_headers: {'X-FORWARDED-PROTOCOL': 'ssl', 'X-FORWARDED-PROTO': 'https', 'X-FORWARDED-SSL': 'on'}
  forwarded_allow_ips: ['127.0.0.1']
  accesslog: /home/260190/PycharmProjects/文档内容修订检测/gunicorn/access.log
  disable_redirect_access_to_syslog: False
  access_log_format: %(h)s %(l)s %(u)s %(t)s "%(r)s" %(s)s %(b)s "%(f)s" "%(a)s"
  errorlog: /home/260190/PycharmProjects/文档内容修订检测/gunicorn/error.log
  loglevel: debug
  capture_output: True
  logger_class: gunicorn.glogging.Logger
  logconfig: None
  logconfig_dict: {}
  syslog_addr: udp://localhost:514
  syslog: False
  syslog_prefix: None
  syslog_facility: user
  enable_stdio_inheritance: False
  statsd_host: None
  statsd_prefix: 
  proc_name: None
  default_proc_name: main:app
  pythonpath: None
  paste: None
  on_starting: <function OnStarting.on_starting at 0x7fc33c6579d8>
  on_reload: <function OnReload.on_reload at 0x7fc33c657ae8>
  when_ready: <function WhenReady.when_ready at 0x7fc33c657bf8>
  pre_fork: <function Prefork.pre_fork at 0x7fc33c657d08>
  post_fork: <function Postfork.post_fork at 0x7fc33c657e18>
  post_worker_init: <function PostWorkerInit.post_worker_init at 0x7fc33c657f28>
  worker_int: <function WorkerInt.worker_int at 0x7fc33c47e0d0>
  worker_abort: <function WorkerAbort.worker_abort at 0x7fc33c47e1e0>
  pre_exec: <function PreExec.pre_exec at 0x7fc33c47e2f0>
  pre_request: <function PreRequest.pre_request at 0x7fc33c47e400>
  post_request: <function PostRequest.post_request at 0x7fc33c47e488>
  child_exit: <function ChildExit.child_exit at 0x7fc33c47e598>
  worker_exit: <function WorkerExit.worker_exit at 0x7fc33c47e6a8>
  nworkers_changed: <function NumWorkersChanged.nworkers_changed at 0x7fc33c47e7b8>
  on_exit: <function OnExit.on_exit at 0x7fc33c47e8c8>
  proxy_protocol: False
  proxy_allow_ips: ['127.0.0.1']
  keyfile: None
  certfile: None
  ssl_version: 2
  cert_reqs: 0
  ca_certs: None
  suppress_ragged_eofs: True
  do_handshake_on_connect: False
  ciphers: TLSv1
  raw_paste_global_conf: []
[2019-07-04 19:37:21 +0800] [31677] [INFO] Starting gunicorn 19.9.0
[2019-07-04 19:37:21 +0800] [31677] [DEBUG] Arbiter booted
[2019-07-04 19:37:21 +0800] [31677] [INFO] Listening at: http://172.28.171.98:8080 (31677)
[2019-07-04 19:37:21 +0800] [31677] [INFO] Using worker: sync
[2019-07-04 19:37:21 +0800] [31680] [INFO] Booting worker with pid: 31680
[2019-07-04 19:37:21 +0800] [31677] [DEBUG] 1 workers
[2019-07-04 19:37:41 +0800] [31680] [DEBUG] worker: SIGWINCH ignored.
[2019-07-04 19:37:41 +0800] [31677] [INFO] Handling signal: winch
[2019-07-04 19:37:41 +0800] [31677] [DEBUG] SIGWINCH ignored. Not daemonized

三、项目中的配置文件config.py :

有的也写成gunicorn.conf,应该是一样的

import multiprocessing
bind = "127.0.0.1:5000"
# workers = multiprocessing.cpu_count() * 2 + 1
workers = 10
accesslog = '/home/gunicorn/access.log'  # 访问日志目录
errorlog  = '/home/gunicorn/error.log'  # 错误日志目录
capture_output = True  # 重定向标准输出到错误日志。默认为False。
timeout = 600  # 过期时间
loglevel = "debug"  # 日志级别,这个日志级别指的是错误日志的级别,而访问日志的级别无法设置  
# debug、info、warning、error、critical
reload = True  # 重载 更改代码的时候重启workers, 只建议在开发过程中开启。
daemon = True  # 以守护进程形式来运行Gunicorn进程。其实就是将这个服务放到后台去运行。默认为False。

启动:gunicorn -c config.py main:app 或者 gunicorn -c gunicorn.conf main:app

三、总结

命令行运行 gunicorn -c config.py main:app ,开启10进程,超时时间为10min,服务后台运行,重定向标准输出到错误日志,输出错误日志,访问日志等。解决了之前总是用nohup python main.py >out.log 2>&1 &来启动Flask后台服务的问题。

「Python」基于Gunicorn、Flask和Docker的高并发部署 参数确保使用最新的Dockerfile重新构建镜像。这个命令会构建Docker镜像并启动服务。,来模拟高并发请求并测试应用的性能。(Apache Bench)或。使用压力测试工具,如。 阅读详情

相关推荐

智能制造 | 如何快速自动生成站位表及自动与BOM校验?

一、站位表(SMT行业中)是SMT上料防错的基础信息,用于对需上料物料与产线、贴片机位置、飞达规格型号、用量,建立基础资料。 SMT站位表是否正确? 首先需要人工确认站位表与SMT程序的是否符合,上料员依照站位表安装好后,确认人员需有第三方确认者 (品管确定)核对。 站位表内容包括什么? 站位表内容为:SMT站位号相对应的物料编码,元件位号,飞达大小/间距,数量等等,根据不同公司的要求而定义。 就目前来说,基本每一款贴片机都可以输出站位清单 但对于企业来说,直接输出的站位清单一般不直接使用,需要进行手动处理

vayoinfo111的博客 4942

Flask搭建服务(四):gunicorn使得http服务并发执行

gunicorn是一个python Wsgi http server,只支持在Unix系统上运行,来源于Ruby的unicorn项目。Gunicorn使用prefork master-worker模型(在gunicorn中,master被称为arbiter),能够与各种wsgi web框架协作。gunicorn的文档是比较完善的,这里也有部分中文翻译。

凝眸伏笔的博客 1767

ADS1299寄存器配置与应用实战指南

本文提供了ADS1299高精度生物电信号采集芯片的寄存器配置与应用实战指南。详细解析了采样率、增益、转换模式等核心寄存器的设置方法,并分享了数据读取、高级功能配置及常见问题的调试心得,帮助开发者快速掌握ADS1299的配置技巧,实现稳定的ECG/EEG信号采集。

weixin_28278377的博客 194

OpenSUSE+nginx+gunicorn+django+redis+postgresql网站部署

之前曾经在Ubuntu下安装过类似的一个网站,不过Ubuntu自带的软件包不太符合我的需求,而且实际用起来我感觉Ubuntu速度有点慢,所以后来想还是切换到OpenSUSE 这是之前在Ubuntu下折腾的记录 https://blog.youkuaiyun.com/silent_missile/article/details/102023169 在OpenSUSE服务器上部署一个自己开发的网站,网站比较复杂,用到了很多组件,这些组件如标题所示,需要一步步进行部署。这里把我摸索的步骤记录下来,以供未来参考 首先是

silent_missile的博客 863

STM32与K210串口通信

这篇文章是为了填上一篇埋下的坑,k210和STM32通过串口通信,我是采用数据包的形式发送数据的,因为K210发送的数据有几种,采用数据包的形式发送比较安全。本文代码运行的平台是STM32F103C8T6和K210 Dock,只涉及到K210发送数据给STM32,stm32将接受到的数据显示到0.96寸OLED屏上。

qq_70715693的博客 3万+

SAP ABAP实战:用GN_DELIVERY_CREATE批量创建内部交货单的完整代码与避坑指南

本文详细介绍了在SAP ABAP开发中使用GN_DELIVERY_CREATE函数批量创建内部交货单的完整实现方案。通过数据结构设计、多源数据整合、批量处理逻辑和错误处理机制等核心环节的深入解析,帮助开发者高效完成物流单据自动化处理,特别针对VL31N/VL32N等常见场景提供避坑指南。

weixin_42116058的博客 343

【已解决】Debian11下gunicorn使用流程和报错解决

[2022-10-08 11:51:23 +0800] [2467] [DEBUG] worker: SIGWINCH ignored. [2022-10-08 11:51:23 +0800] [2466] [INFO] Handling signal: winch [2022-10-08 11:51:23 +0800] [2466] [DEBUG] SIGWINCH ignored. Not daemonized

qq_44330459的博客 1444

android广告SDK原理详解(附源码)

广大的开发者吃糠咽菜开发了一两款APP,获取了一些流量后自然就会想到流量变现,一般情况下大家会选择到百度联盟或者Google Admob这些广告服务提供商注册开发者账号,在自己的APP里面加上几行广告位代码,集成他们的广告SDK包。然后谋事在人,成事在天,只有每天看报表查查收益。   也有一些开发者为了能够提高自己的变现水平,同时接入了好几家的sdk,哪家出的收益高一点我就出哪家的广告,但是这

rmcgogo的博客 1万+

gunicorn flask的请求流程

当运行gunicorn这个命令启动flask的时候 首先回去调用gunicorn/app/wsgiapp中的run方法 回去调用run()方法,这个run方式本质是gunicorn/arbiter中的run()方法 主要就关注其中manage_workers()方法 很明显调用了spawn_workers()方法,这个方式只是遍历了spawn_worker()。因此我们直接看s

鶸者为何战斗 6259

Python GUI编程:视频播放器(opencv、tkinter、PIL、ffpyplayer、threading)

用了几天做了一个视频播放器,搞了几个版本,开始想的是运用cv2模块把视频转化成一张张图片,然后再用ffpyplayer模块下的相关类来播放视频。但是,结果画面和视频的音频播放不同步(原因是cv2将转换得到的图片展示到tk上canvas,花费的时间多于每张图片应该展示的时间[1/fps])。后面看到ffpyplayer这个模块官网的介绍,发现这个模块可以得到视频播放时的图片,只不过这个图片是一个对象,我对这个不是很了解,到网上找了很久,终于找到了一篇文章,说可以利用PIL模块下的相关类,把上述这个对象转化成。

坚持不懈的大白的博客 3407

PCL 改进的RANSAC算法实现点云粗配准【2024最新版】

一种改进的RANSAC点云粗配准算法,具体改进见论文:“Pose Estimation using Local Structure-Specific Shape and Appearance Context”

点云侠的博客 37万+

gunicorn+flask posix_ipc.SignalError: The wait was interrupted by a signal

有一个flask写的接口服务,因为加了缓存服务也只是服务器上本地使用所以只能使用一个work来处理请求,如果只用python server来启动回自动扩展进程,所以配置gunicorn来使用,之前服务的启动的命令为 gunicorn -w 1 -b 0.0.0.0:80 app:app 因为不需要日志,所以就开了个tmux查看进程,结果今天遇到一个错误: [2022-02-18 14:31:56 +0800] [29517] [INFO] Handling signal: winch [2022-02-18

BankxiY的博客 1234

什么是 SAP PCE?

SAP Private Cloud Edition 是一种基于云计算的部署模式,它结合了公有云的灵活性和私有云的安全性,为企业提供了量身定制的云服务。在 PCE 环境中,SAP 托管和维护客户的应用系统(如 SAP S/4HANA、SAP SuccessFactors 或 SAP BW/4HANA),同时客户拥有更高的定制化权限。专属环境:每个客户在云中拥有独立的资源,这保障了更高的安全性和性能。全面托管:SAP 提供基础架构、系统管理和更新服务,降低了客户的运维成本。灵活扩展。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 2243

Python 解析 Flask+Gunicorn+Nginx 高并发架构

Flask是一个轻量级的Web应用框架,它使用Werkzeug作为WSGI工具箱,并使用Jinja2模板引擎。Gunicorn(Green Unicorn)是一个Python WSGI HTTP服务器,它是为Unix设计的。Gunicorn是一个预叉工作模式的服务器。这意味着它有一个主进程管理器和多个工作进程。当接收到请求时,这些工作进程会并行地处理请求,从而提高了处理高并发请求的能力。Nginx是一个高性能的HTTP和反向代理服务器,也是一个IMAP/POP3/SMTP代理服务器。

2501_90727642的博客 396

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

Flask+gunicorn实现web服务并发调用Python程序,解决多线程/多进程问题

Flask+gunicorn实现web服务并发调用Python/Pytorch程序,解决多线程/多进程问题 项目场景: 项目需求:将客户端的请求经由Web服务器转发给Flask程序实例,调用Python/Pytorch程序。 问题描述:由于Flask框架默认是单进程,单线程阻塞的任务模式,为了实现并发,可以用 gunicorn 来部署Flask服务。这里用Flask+gunicorn实现python应用的部署,同理可以迁移到pytorch、tensorflow等机器学习、深度学习模型的部署。

qq_39691492的博客 8149

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

Python高并发服务部署——Nginx+Gunicorn+gevent+Flask+Supervisor

以Ubuntu和CentOS为例,详细步骤部署Python高并发服务——-Nginx+Gunicorn+gevent+Flask+Supervisor

XerCis的博客 2518

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

flask+gunicorn,python服务器端部署深度学习模型 postman高并发测试

flask postman

m0_37192554的博客 2470

python高并发框架http请求_Python 2.7 Gunicorn + Flask,有大量的第三方服务 http 请求, requests 库阻塞导致出现性能瓶颈...

982017-08-18 19:21:01 +08:00 3@JasperYanky 总结一下:本文内的问题是,在基于 gevent 的 http server 上大量使用 requests 时速度很慢,甚至会超时,看起来像阻塞了一样。最后楼主通过调大 pool manager 的 maxsize 解决了问题。然后我通过类似 #69 的测试方法复现了这个问题,并横向测试了其他方案的一些表现。...

weixin_33695631的博客 718

linux+python虚拟环境下flask使用gunicorn+nginx高并发部署

背景 总有人问我博客怎么部署,这里简单写下过程 1、下载源码 $ git clone https://gitee.com/pojoin/h3blog.git $ cd h3blog $ python -m venv venv #创建python虚拟环境 $ source venv/bin/activate $ $ pip install -r requirements.txt # 安装项目依赖,可能不全,根据提示自行安装即可 2、修改配置文件 $ vim .env FLASK_CONFIG=prod

编辑编辑器 1417

Python的gunicorn服务器配置

Gunicorn是Python WSGI服务器,用于部署Flask/Django等应用。摘要介绍了Gunicorn的基本功能、安装方法、启动Flask应用的步骤,以及常用参数说明。重点内容包括:通过命令行或配置文件启动Gunicorn(示例配置详细列出关键参数);注意事项(Windows不兼容问题);推荐的生产环境部署组合(Nginx+Gunicorn+Supervisor)。文章提供了从基础到生产部署的完整指南,适合开发者快速掌握Gunicorn的使用方法。

Andytoe的博客 760
上一篇: LBP原理介绍与人脸识别
下一篇: GIT/GITLAB 克隆 上传 创建项目
Omghhhhhh
博客等级 码龄8年 67粉丝 80原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值