当前位置: 首页 > 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:描述性信息:主目录:默认…...

铭豹扩展坞 USB转网口 突然无法识别解决方法

当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…...

C++ 求圆面积的程序(Program to find area of a circle)

给定半径r,求圆的面积。圆的面积应精确到小数点后5位。 例子: 输入:r 5 输出:78.53982 解释:由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982,因为我们只保留小数点后 5 位数字。 输…...

前端开发面试题总结-JavaScript篇(一)

文章目录 JavaScript高频问答一、作用域与闭包1.什么是闭包(Closure)?闭包有什么应用场景和潜在问题?2.解释 JavaScript 的作用域链(Scope Chain) 二、原型与继承3.原型链是什么?如何实现继承&a…...

08. C#入门系列【类的基本概念】:开启编程世界的奇妙冒险

C#入门系列【类的基本概念】:开启编程世界的奇妙冒险 嘿,各位编程小白探险家!欢迎来到 C# 的奇幻大陆!今天咱们要深入探索这片大陆上至关重要的 “建筑”—— 类!别害怕,跟着我,保准让你轻松搞…...

深入理解Optional:处理空指针异常

1. 使用Optional处理可能为空的集合 在Java开发中,集合判空是一个常见但容易出错的场景。传统方式虽然可行,但存在一些潜在问题: // 传统判空方式 if (!CollectionUtils.isEmpty(userInfoList)) {for (UserInfo userInfo : userInfoList) {…...

Scrapy-Redis分布式爬虫架构的可扩展性与容错性增强:基于微服务与容器化的解决方案

在大数据时代,海量数据的采集与处理成为企业和研究机构获取信息的关键环节。Scrapy-Redis作为一种经典的分布式爬虫架构,在处理大规模数据抓取任务时展现出强大的能力。然而,随着业务规模的不断扩大和数据抓取需求的日益复杂,传统…...

阿里云Ubuntu 22.04 64位搭建Flask流程(亲测)

cd /home 进入home盘 安装虚拟环境: 1、安装virtualenv pip install virtualenv 2.创建新的虚拟环境: virtualenv myenv 3、激活虚拟环境(激活环境可以在当前环境下安装包) source myenv/bin/activate 此时,终端…...

【Kafka】Kafka从入门到实战:构建高吞吐量分布式消息系统

Kafka从入门到实战:构建高吞吐量分布式消息系统 一、Kafka概述 Apache Kafka是一个分布式流处理平台,最初由LinkedIn开发,后成为Apache顶级项目。它被设计用于高吞吐量、低延迟的消息处理,能够处理来自多个生产者的海量数据,并将这些数据实时传递给消费者。 Kafka核心特…...

《信号与系统》第 6 章 信号与系统的时域和频域特性

目录 6.0 引言 6.1 傅里叶变换的模和相位表示 6.2 线性时不变系统频率响应的模和相位表示 6.2.1 线性与非线性相位 6.2.2 群时延 6.2.3 对数模和相位图 6.3 理想频率选择性滤波器的时域特性 6.4 非理想滤波器的时域和频域特性讨论 6.5 一阶与二阶连续时间系统 6.5.1 …...

Linux-进程间的通信

1、IPC: Inter Process Communication(进程间通信): 由于每个进程在操作系统中有独立的地址空间,它们不能像线程那样直接访问彼此的内存,所以必须通过某种方式进行通信。 常见的 IPC 方式包括&#…...