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

LeetCode 01矩阵中距离题解

LeetCode 01矩阵中距离题解 题目描述 给定一个 01 矩阵,找到每个 0 到最近的 0 的距离。 示例: 输入:mat [[0,0,0],[0,1,0],[1,1,1]]输出:[[0,0,0],[0,1,0],[1,2,1]] 解题思路 方法:BFS 思路: 使用 BFS 从…...

VMOS+小黄鸟无root抓包实战:从环境搭建到证书导入的完整避坑指南

1. 为什么需要VMOS小黄鸟组合抓包 很多安卓开发者或者安全爱好者都遇到过这样的困扰:想要分析某个APP的网络请求,却发现抓包工具显示"无网络连接"。这种情况在安卓7.0及以上版本尤为常见,主要是因为系统加强了SSL证书验证机制。传统…...

如何快速下载Fansly内容:完整Fansly Downloader使用指南

如何快速下载Fansly内容:完整Fansly Downloader使用指南 【免费下载链接】fansly-downloader Easy to use fansly.com content downloading tool. Written in python, but ships as a standalone Executable App for Windows too. Enjoy your Fansly content offlin…...

终极指南:如何在Windows电脑上实现AirPlay 2无线投屏功能

终极指南:如何在Windows电脑上实现AirPlay 2无线投屏功能 【免费下载链接】airplay2-win Airplay2 for windows 项目地址: https://gitcode.com/gh_mirrors/ai/airplay2-win 还在为Windows电脑无法接收iPhone、iPad或Mac的屏幕镜像而烦恼吗?Airpl…...

独立开发者如何利用 Taotoken 统一管理多个 AI 项目支出

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 独立开发者如何利用 Taotoken 统一管理多个 AI 项目支出 对于同时维护多个小型 AI 应用或实验项目的独立开发者而言,成…...

Taotoken多模型聚合平台在智能客服场景下的应用实践

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 Taotoken多模型聚合平台在智能客服场景下的应用实践 对于智能客服系统的开发者而言,对话质量与成本控制是两大核心关切…...

歌词滚动姬:重新定义歌词时间轴同步的专业级工具

歌词滚动姬:重新定义歌词时间轴同步的专业级工具 【免费下载链接】lrc-maker 歌词滚动姬|可能是你所能见到的最好用的歌词制作工具 项目地址: https://gitcode.com/gh_mirrors/lr/lrc-maker 还在为歌词与音乐不同步而烦恼吗?是否曾经花…...

Visara:可视化代码仓库分析工具的设计原理与工程实践

1. 项目概述:一个面向开发者的视觉化代码仓库分析工具最近在和一些团队做代码评审和架构梳理时,我常常遇到一个痛点:面对一个陌生的、动辄几十上百个文件的代码仓库,如何快速理解它的整体结构、模块依赖和关键文件?传统…...

Minimax算法在技能学习中的应用:构建抗风险技术成长路径

1. 项目概述与核心价值最近在GitHub上看到一个挺有意思的项目,叫justl9169/minimax-skills。光看名字,你可能会联想到“最小化-最大化”算法,也就是博弈论里那个经典的Minimax。没错,这个项目的核心灵感确实来源于此,但…...

《迈向生产的智能体》开源指南:28个教程助你将AI智能体转化为现实产品!

《迈向生产的智能体》开源指南:涵盖28个生产级教程,助你将AI智能体转化为现实产品!《迈向生产的智能体》是构建可从原型扩展到企业级应用的生成式AI(GenAI)智能体的首选资源,教程涵盖有状态工作流、向量内存…...