当前位置: 首页 > news >正文

windows flask 多进程高并发

最近在做的一个项目,需要将十几个python函数封装程flask服务供外界调用,每个函数之间没有什么关系,相互独立。虽然感觉不是很难,但因为用的windows系统,遇到的坑比较多,在此一一总结一下。

flask偶尔出现卡死问题

见上一篇文章

不能高并发问题

因为十几个函数都要被调用,而且调用量不小,对响应时效性有较高要求,需要能充分利用CPU并行计算,采用了如下几个解决方法

1.flask + gevent + multiprocess + wsgi

在网上搜到这个解决方案
但不知道是系统原因还是我的算法原因,运行之后发现CPU占用量比较低,而且同时收到服务请求后是串行计算并返回的。看来这种方法在我这种情况下并不适用。

2.设置多线程

还有一个解决方法是代码运行时设置多线程,即输入命令
python 文件名.py runserver --threaded
但发现依然没有并行计算

3.设置多进程

这个解决方案是在代码的app.run()函数中设置process=n,n就是你想要的进程数。但设置之后报错,说是不能同时设置多线程和多进程。然后又在app.run()中设置threaded=False,发现又报错,可能是这个功能只支持linux系统而不支持windows

还看到nginx和gunicorn的方法,但是不知道这个对windows是否支持,而且好像有点麻烦就没有试

4.手动负载均衡

通过测试发现一个现象,就是flask并非完全串行,当同时接收到2个请求,如果执行第一个请求会占用计算资源,那么就是算完第一个再算第二个,而如果第一个请求的计算是等待(比如time.sleep)或者挂起状态,则会同时去处理第二个请求而不用等到第一个请求返回结果。
因此想到了一个解决方法,就是每个函数都单独启一个flask服务,对于耗时比较长的函数根据需求多启几个服务,每个服务设置的端口号不同,然后再启动一个对外的flask服务,外界所有请求都发送到这一个flask端口,然后这个端口内部再向对应的flask服务发送请求。
原始flask代码:

from flask import Flask, render_template
from gevent.pywsgi import WSGIServer
from gevent import monkey
import time
import jsonmonkey.patch_all()
app = Flask(__name__)@app.route('/')
def connect():return "connected test"@app.route('/index')
def index_test():time0 = time.time()for i in range(10000):j = list(range(1000))print(time.time() - time0)res = {'data':1}res = json.dumps(res)return resif __name__ == "__main__":server  = WSGIServer(("0.0.0.0", 5000), app)print("Server started")server.serve_forever()

测试调用代码:

import requests
from threading import Thread
import time
def req():time0 = time.time()res = requests.get('http://127.0.0.1:5000/index')print(time.time() - time0)# print(res.text)
for i in range(5):th = Thread(target=req)th.start()

结果:
fask端显示的结果为

0.5939996242523193
127.0.0.1 - - [2023-10-12 09:49:03] "GET /index HTTP/1.1" 200 127 0.600002
0.48799610137939453
127.0.0.1 - - [2023-10-12 09:49:04] "GET /index HTTP/1.1" 200 127 0.488996
0.5429947376251221
127.0.0.1 - - [2023-10-12 09:49:04] "GET /index HTTP/1.1" 200 127 0.544997
0.4839961528778076
127.0.0.1 - - [2023-10-12 09:49:05] "GET /index HTTP/1.1" 200 127 0.485996
0.4319908618927002
127.0.0.1 - - [2023-10-12 09:49:05] "GET /index HTTP/1.1" 200 127 0.434000

请求发送端显示的结果是

1.0300004482269287
1.3990015983581543
1.8730018138885498
2.3450255393981934
2.831998586654663

收到返回的时间却在逐渐增加,说明没有并行计算

改进代码:
入口flask代码:

from flask import Flask, render_template
from gevent.pywsgi import WSGIServer
from gevent import monkey
import requests
import time
import jsonmonkey.patch_all()
app = Flask(__name__)
path_num = {'num':-1}
@app.route('/')
def connect():return "connected test"@app.route('/index')
def index_test():# time0 = time.time()# for i in range(10000):# 	j = list(range(1000))# print(time.time() - time0)# res = {'data':1}# res = json.dumps(res)if path_num['num'] > 4:path_num['num'] = 0else:path_num['num'] += 1num = path_num['num']url = f'http://127.0.0.1:{9030+num}/index'res = requests.post(url=url)return res.textif __name__ == "__main__":server  = WSGIServer(("0.0.0.0", 5000), app)server.serve_forever()# app.run()

算法flask代码

from flask import Flask, render_template
from gevent.pywsgi import WSGIServer
from gevent import monkey
import time
import jsonmonkey.patch_all()
app = Flask(__name__)@app.route('/')
def connect():return "connected test"@app.route('/index')
def index_test():time0 = time.time()for i in range(10000):j = list(range(1000))print(time.time() - time0)res = {'data':1}res = json.dumps(res)return resif __name__ == "__main__":server  = WSGIServer(("0.0.0.0", 9030), app)print("Server started")server.serve_forever()# app.run()

这里的算法flask代码启动了5个,接口分别是9030~9034
用同样的方式测试,返回的结果为

0.0500025749206543
0.05100274085998535
0.050002098083496094
0.05200028419494629
0.062003135681152344

差不多同时返回

总结

虽然最后一种方式有点麻烦,但可以解决现有问题,其中算法flask服务启动的越多性能越好。

相关文章:

windows flask 多进程高并发

最近在做的一个项目,需要将十几个python函数封装程flask服务供外界调用,每个函数之间没有什么关系,相互独立。虽然感觉不是很难,但因为用的windows系统,遇到的坑比较多,在此一一总结一下。 flask偶尔出现卡…...

【设计模式】十、组合模式

文章目录 案例组合模式基本介绍类图代码 组合模式在 JDK 集合的源码分析组合模式的注意事项和细节 案例 编写程序展示一个学校院系结构:需求是这样,要在一个页面中展示出学校的院系组成,一个学校有多个学院,一个学院有多个系。如…...

React知识点系列(8)-每天10个小知识

目录 1. 在 React 中,什么是受控组件和非受控组件?请解释一下它们之间的区别和适用场景。2. 如何使用 React 的 useReducer Hook 来管理组件状态?请描述一下 useReducer 的工作原理和适用场景。工作原理:适用场景: 3. …...

rust注释

一、普通注释 // 这是第一种注释方式/* 这是第二种注释方式 */ /* 多行注释 多行注释 多行注释*/二、文档注释 ///外部行文档注释。为接下来的项生成帮助文档 //! 内部行文档注释。为注释所属于的项生成帮助文档/**...*/外部块文档注释。为接下来的项生成帮助文档 /*!...*/内…...

【Java学习之道】GUI开发的基本概念

引言 在这一章,我们将一起走进Java的图形用户界面(GUI)开发的世界。在你阅读完这篇文章后,你将能够了解什么是GUI,以及如何使用Java进行GUI的开发。 一、什么是GUI 首先,让我们来解答一个许多初学者都会…...

Docker部署gitlab_ce(避坑版---社区版)

1 下载docker 2 下载gitlab镜像 3 运行 4 进入容器内部修改 5 在浏览器里访问 6 修改root密码(如果忘记请修改) 1 下载docker # 安装依赖 yum install -y yum-utils device-mapper-persistent-data lvm2# 设置yum源 yum-config-manager --add-repo https…...

数据仓库DW-理论知识储备

数据仓库DW 数据仓库具备 采集数据、分析数据、存储数据的功能,最后得出一些有用的数据,一些目标数据来使用。 采集来自不同源的数据,然后对这些数据进行分析和计算得出一些有用的指标,提供数据决策支持。 数据的来源有&#xff…...

SpringBoot 如何优雅的停机

这里写目录标题 1 介绍2 使用2.1 开启 hook2.2 禁用 hook 3 手动指定 hook 1 介绍 SpringBoot 如果需要使用hook则需要开启spring.main.register-shutdown-hooktrue(默认为true) 如果使用kill -9则不会出发JVM的hook,kill可以正常触发hook server:port: 8080shutd…...

详细教程:Postman 怎么调试 WebSocket

WebSocket 是一个支持双向通信的网络协议,它在实时性和效率方面具有很大的优势。Postman 是一个流行的 API 开发工具,它提供了许多功能来测试和调试 RESTful API 接口,最新的版本也支持 WebSocket 接口的调试。想要学习更多关于 Postman 的知…...

互联网Java工程师面试题·Java 并发编程篇·第五弹

目录 52、什么是线程池? 为什么要使用它? 53、怎么检测一个线程是否拥有锁? 54、你如何在 Java 中获取线程堆栈? 55、JVM 中哪个参数是用来控制线程的栈堆栈小的? 56、Thread 类中的 yield 方法有什么作用? 57、…...

mysql与oracle分页的有什么区别

Java面试:mysql与oracle分页的有什么区别 相信许多人在日常工作中都会用到分页,比如日常查询数据量太大,而我们只需要其中的几条即可,所以这时就会去使用分页去查询,今天主要就mysql与oracle的分页进行分析。 MySQL 分…...

华为云云耀云服务器L实例评测|华为云耀云服务器L实例docker部署及应用(七)

八、华为云耀云服务器L实例docker、docker-compose安装及部署MySQL、Redis应用: 随着云原生、容器化、微服务、K8S等技术的发展,容器 docker 也逐渐在企业团队实践中大量的使用。它可以提供了一套标准化的解决方案,极大地提升了部署、发布、运…...

实体解析实施的复杂性

实体的艺术表现斯特凡伯克纳 一、说明 实体解析是确定数据集中的两条或多条记录是否引用同一现实世界实体(通常是个人或公司)的过程。乍一看,实体分辨率可能看起来像一个相对简单的任务:例如,给定一张人物的两张照片&a…...

MAKEFLAGS += -rR --include-dir=$(CURDIR)的含义

一、目的 在看uboot顶层Makefile文件时遇到这个代码不甚明白,故查找了一下资料以供大家学习 二、介绍 MAKEFLAGS -rR 表示禁止使用内置的隐含规则和变量定义;这个选项用于启用recursive make,使得Makefile目标可以调用其他Makefile目标&…...

maven问题与解决方案、部署

问题一、was cached in the local repository, resolution will not be reattempted until the update interval of idea中 Maven中Lifecycle时,能正常clean 和 install,但在idea的Terminal中mvn install出现: was cached in the local repo…...

【大数据】Hadoop MapReduce与Hadoop YARN(学习笔记)

一、Hadoop MapReduce介绍 1、设计构思 1)如何对付大数据处理场景 对相互间不具有计算依赖关系的大数据计算任务,实现并行最自然的办法就是采取MapReduce分而治之的策略。 不可拆分的计算任务或相互间有依赖关系的数据无法进行并行计算! …...

接口测试文档

接口测试的总结文档 第一部分:主要从问题出发,引入接口测试的相关内容并与前端测试进行简单对比,总结两者之前的区别与联系。但该部分只交代了怎么做和如何做?并没有解释为什么要做? 第二部分:主要介绍为什…...

Ubuntu中不能使用ifconfig命令

​ 问题 打开终端使用如下命令不能运行: ifconfig显示如下错误: 解决方法 在VMware中的虚拟机下面打开“编辑虚拟机设置”,或者在已经打开的虚拟机面板上面打开“虚拟机—设置” 选择网络适配器,选择“NAT模式”,没开机的就…...

BAT020:将文本文档中多行文本拼接为;分隔的单行文本

引言:编写批处理程序,实现将文本文档中多行文本拼接为;分隔的单行文本。 一、新建Windows批处理文件 参考博客: CSDNhttps://mp.csdn.net/mp_blog/creation/editor/132137544 二、写入批处理代码 1.右键新建的批处理文件,点击【…...

安防初识命令【学习笔记】

1、美杜莎爆破 medusa -M ssh -h 192.168.42.135 -u guest -P top1000.txt -t 8 2、passwd文件与shadow文件 root:x:0:0:root:/root:/usr/bin/zsh 用户名:密码:uid:gid:描述性信息:主目录:默认…...

(二)TensorRT-LLM | 模型导出(v0.20.0rc3)

0. 概述 上一节 对安装和使用有个基本介绍。根据这个 issue 的描述,后续 TensorRT-LLM 团队可能更专注于更新和维护 pytorch backend。但 tensorrt backend 作为先前一直开发的工作,其中包含了大量可以学习的地方。本文主要看看它导出模型的部分&#x…...

【CSS position 属性】static、relative、fixed、absolute 、sticky详细介绍,多层嵌套定位示例

文章目录 ★ position 的五种类型及基本用法 ★ 一、position 属性概述 二、position 的五种类型详解(初学者版) 1. static(默认值) 2. relative(相对定位) 3. absolute(绝对定位) 4. fixed(固定定位) 5. sticky(粘性定位) 三、定位元素的层级关系(z-i…...

oracle与MySQL数据库之间数据同步的技术要点

Oracle与MySQL数据库之间的数据同步是一个涉及多个技术要点的复杂任务。由于Oracle和MySQL的架构差异,它们的数据同步要求既要保持数据的准确性和一致性,又要处理好性能问题。以下是一些主要的技术要点: 数据结构差异 数据类型差异&#xff…...

Windows安装Miniconda

一、下载 https://www.anaconda.com/download/success 二、安装 三、配置镜像源 Anaconda/Miniconda pip 配置清华镜像源_anaconda配置清华源-CSDN博客 四、常用操作命令 Anaconda/Miniconda 基本操作命令_miniconda创建环境命令-CSDN博客...

嵌入式学习之系统编程(九)OSI模型、TCP/IP模型、UDP协议网络相关编程(6.3)

目录 一、网络编程--OSI模型 二、网络编程--TCP/IP模型 三、网络接口 四、UDP网络相关编程及主要函数 ​编辑​编辑 UDP的特征 socke函数 bind函数 recvfrom函数(接收函数) sendto函数(发送函数) 五、网络编程之 UDP 用…...

Neko虚拟浏览器远程协作方案:Docker+内网穿透技术部署实践

前言:本文将向开发者介绍一款创新性协作工具——Neko虚拟浏览器。在数字化协作场景中,跨地域的团队常需面对实时共享屏幕、协同编辑文档等需求。通过本指南,你将掌握在Ubuntu系统中使用容器化技术部署该工具的具体方案,并结合内网…...

LangChain【6】之输出解析器:结构化LLM响应的关键工具

文章目录 一 LangChain输出解析器概述1.1 什么是输出解析器?1.2 主要功能与工作原理1.3 常用解析器类型 二 主要输出解析器类型2.1 Pydantic/Json输出解析器2.2 结构化输出解析器2.3 列表解析器2.4 日期解析器2.5 Json输出解析器2.6 xml输出解析器 三 高级使用技巧3…...

qt+vs Generated File下的moc_和ui_文件丢失导致 error LNK2001

qt 5.9.7 vs2013 qt add-in 2.3.2 起因是添加一个新的控件类,直接把源文件拖进VS的项目里,然后VS卡住十秒,然后编译就报一堆 error LNK2001 一看项目的Generated Files下的moc_和ui_文件丢失了一部分,导致编译的时候找不到了。因…...

【java】【服务器】线程上下文丢失 是指什么

目录 ■前言 ■正文开始 线程上下文的核心组成部分 为什么会出现上下文丢失? 直观示例说明 为什么上下文如此重要? 解决上下文丢失的关键 总结 ■如果我想在servlet中使用线程,代码应该如何实现 推荐方案:使用 ManagedE…...

理想汽车5月交付40856辆,同比增长16.7%

6月1日,理想汽车官方宣布,5月交付新车40856辆,同比增长16.7%。截至2025年5月31日,理想汽车历史累计交付量为1301531辆。 官方表示,理想L系列智能焕新版在5月正式发布,全系产品力有显著的提升,每…...