Flask使用长连接(Connection会失效)、http的keep-alive、webSocket。---GPU的CUDA会内存不足报错

news2024/12/23 1:32:15

Flask Curl命令返回状态Connection: close转keep-alive的方法

使用waitress-serve启动
waitress-serve --listen=0.0.0.0:6002 manage:app
使用Gunicorn命令启动
gunicorn -t 1000 -w 2 -b 0.0.0.0:6002 --worker-class gevent --limit-request-line 8190 manage:app

Flask使用flask_socketio实现websocket
Python中的单例模式

‌WebSocket和HTTP Keep-Alive的主要区别在于它们的工作机制、数据传输方式以及应用场景。‌

工作机制 ‌HTTP
Keep-Alive‌:HTTP协议通过Keep-Alive头字段支持长连接,允许在一次TCP连接中发送多个请求和响应。尽管这减少了建立新连接的开销,但每次请求仍然需要发送完整的HTTP头部信息,且服务器和客户端之间的通信是单向的,即客户端发送请求,服务器响应‌。

‌WebSocket‌:WebSocket通过一次HTTP握手建立连接后,后续的数据交换不再需要发送HTTP头部信息。它允许服务器和客户端之间的双向通信,即双方都可以主动发送消息,实现了真正的全双工通信‌。

数据传输方式 ‌HTTP
Keep-Alive‌:在使用Keep-Alive的情况下,每次请求仍然需要发送完整的HTTP头部信息,这会导致信息交换效率较低‌。

‌WebSocket‌:WebSocket在建立连接后,后续的数据交换不需要再发送HTTP头部信息,这显著提高了数据传输的效率‌。

应用场景 ‌HTTP‌:适用于传输网页、图片、文本等静态资源,以及通过RESTful API进行数据传输。由于其无状态和单向通信的特性,HTTP更适合于不需要实时交互的应用场景‌。

‌WebSocket‌:广泛应用于需要实时交互的场景,如实时聊天、在线游戏、金融行业的实时数据更新等。由于其全双工通信的特性,WebSocket能够更好地支持需要双向通信的应用‌。


HTTP与TCP中keep-alive的区别
1、HTTP协议(七层)的Keep-Alive意图在于连接复用,希望可以短时间内在同一个连接上进行多次请求/响应。核心在于:时间要短,速度要快。
   举个例子,你搞了一个好项目,想让马云爸爸投资,马爸爸说,"我很忙,最多给你3分钟”,你需要在这三分钟内把所有的事情都说完。

2、TCP协议(四层)的KeepAlive机制意图在于保活、心跳,检测连接错误。核心在于:虽然频率低,但是持久。

在这里插入图片描述
在HTTP通信中,连接复用(Connection Reuse)是一个重要的概念,它允许客户端和服务器在同一个TCP连接上发送和接收多个HTTP请求/响应,而不是为每个新的请求/响应都创建一个新的连接。这种技术可以显著提高网络性能,减少网络延迟和资源消耗。在Python中,我们可以使用多种方法来实现HTTP请求的连接复用。

  1. HTTP/1.1的持久连接(Keep-Alive)

HTTP/1.1标准引入了持久连接(也称为Keep-Alive连接)的概念,允许客户端和服务器在单个TCP连接上发送多个请求和响应。默认情况下,许多现代的HTTP客户端和服务器都支持持久连接。在Python中,使用http.client或requests库时,通常会自动启用持久连接,除非显式地禁用了它。

  1. 使用requests库的连接池

requests库是一个流行的Python HTTP客户端库,它内部使用了连接池来管理TCP连接。连接池允许requests库在多个请求之间复用TCP连接,而无需为每个请求都创建新的连接。通过连接池,requests库能够显著提高网络性能和吞吐量。

  1. 自定义连接复用逻辑

虽然requests库已经为我们提供了连接池的功能,但在某些特定场景下,我们可能需要自定义连接复用的逻辑。这时,我们可以使用http.client库来手动创建和管理TCP连接。通过维护一个持久的TCP连接,并在多个请求之间复用该连接,我们可以实现自定义的连接复用逻辑。

  1. 使用HTTP/2协议

HTTP/2是一个现代的HTTP协议版本,它内置了对连接复用的支持,并提供了更多的性能优化功能。与HTTP/1.1相比,HTTP/2使用二进制帧格式进行通信,支持多路复用(Multiplexing),即允许在一个TCP连接上并发地发送和接收多个请求/响应。在Python中,我们可以使用支持HTTP/2协议的客户端库(如httpx或h2)来发送HTTP请求,并利用HTTP/2的连接复用功能来提高性能。

  1. 注意事项

· 在实现连接复用时,我们需要确保客户端和服务器都支持所使用的协议版本(如HTTP/1.1或HTTP/2)。

· 连接复用可能会增加服务器的负载和响应时间,特别是在高并发的场景下。因此,在实际应用中,我们需要根据具体情况来权衡连接复用的利弊。

· 当不再需要某个连接时,我们应该及时关闭它,以释放系统资源。在Python中,可以使用socket.close()方法或相关库的方法来关闭连接。
1. keepalive 是否开启服务端控制还是客户端控制?
2. keepalive的时间是由服务端控制还是客户端控制?
3. keepalive时间一到,是由客户端主动关闭还是服务端主动关闭?
4. 如果客户端不是httpclient,使用telnet连接服务端?

aiohttp基本及进阶使用

解决TIME_WAIT过多的方法包括以下几种‌:

‌调整系统参数‌:

‌增加最大文件句柄数和最大连接数‌:通过调整操作系统的网络参数,可以减少TIME_WAIT连接数量。可以增加系统的最大文件句柄数(File Descriptor)和最大连接数(Maximum Connections),以便系统能够处理更多的连接请求‌1。
‌调整TCP参数‌:可以调整TCP的参数来减少TIME_WAIT连接数量。例如,调整TCP的timewait超时时间(Time Wait Timeout)来缩短TIME_WAIT状态的持续时间;启用TCP快速回收(TCP Fast Recovery)来立即回收处于TIME_WAIT状态的连接‌12。
‌优化应用程序‌:

‌检查和优化代码‌:确保在建立连接后及时关闭连接,避免产生过多的TIME_WAIT连接。可以优化代码,减少连接的建立和关闭次数,或者使用连接池技术复用连接‌1。
‌使用连接池‌:对于需要频繁建立连接的场景,可以使用连接池来管理连接,避免频繁地创建和关闭连接,从而减少TIME_WAIT连接数量‌12。
‌调整内核参数‌:

‌开启TCP时间戳‌:在Linux系统中,通过开启TCP时间戳功能,可以避免TIME_WAIT状态的累积。可以通过修改/etc/sysctl.conf文件,添加配置net.ipv4.tcp_timestamps=1并执行sysctl -p命令使配置生效‌3。
‌启用TCP连接复用‌:通过修改/etc/sysctl.conf文件,添加配置net.ipv4.tcp_tw_reuse=1并执行sysctl -p命令,允许将TIME_WAIT状态的连接用于新的连接‌34。
‌调整本地端口范围‌:如果本地端口范围设置得太小,可能会导致端口耗尽和TIME_WAIT状态的增加。可以通过调整本地端口范围来减少TIME_WAIT状态的数量‌3。
‌缩短TIME_WAIT超时时间‌:通过修改net.ipv4.tcp_fin_timeout参数,将其设置为更短的时间(如30秒),以缩短TIME_WAIT状态的持续时间‌45。
‌使用连接复用技术‌:

‌HTTP/1.1的keep-alive机制‌:可以使用HTTP/1.1的keep-alive机制来复用TCP连接,减少TIME_WAIT连接数量‌1。
‌HTTP/2的多路复用技术‌:HTTP/2的多路复用技术也可以复用TCP连接,减少TIME_WAIT连接数量‌1。

在这里插入图片描述
WebSocket、Socket、TCP、HTTP区别
WebSocket 与 TCP 的异同
WebSocket(2)–为什么引入WebSocket协议
【TCP】三次握手
【TCP】四次挥手

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2257774.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

用友U8+ API接口使用教程

前言 U8和其他的公开的开放API接口有一些差异,他是需要先对接的到代理服务器,通过代理服务器进行对接,所以只要保证U8能上网就能对接,和畅捷通T的模式有点类似 流程: 注册成为开发者(用于创建用友U8 API应…

xtu oj 1618 素数个数

文章目录 前言代码思路 前言 有点儿难&#xff0c;至少对我来说。去年考试我没写出来。 代码 #include<stdio.h> #include<stdbool.h> #include<stdlib.h>//加 math 那个头文件好像要加这个头文件&#xff0c;我之前编译错误过&#xff0c;血泪教训 #incl…

DAY3 构造函数

构造函数使用代码&#xff1a; #include <iostream> using namespace std; class Rec {const int length;int width; public:Rec():length(10){cout << "Rec无参构造函数" << endl;};Rec(int a,int b):length(a),width(b){cout << "Re…

分布式搜索引擎之elasticsearch基本使用2

分布式搜索引擎之elasticsearch基本使用2 在分布式搜索引擎之elasticsearch基本使用1中&#xff0c;我们已经导入了大量数据到elasticsearch中&#xff0c;实现了elasticsearch的数据存储功能。但elasticsearch最擅长的还是搜索和数据分析。 所以j接下来&#xff0c;我们研究下…

javaScript交互补充

1、元素的三大系列 1.1、offset系列 1.1.1、offset初相识 使用offset系列相关属性可以动态的得到该元素的位置&#xff08;偏移&#xff09;、大小等 ●获得元素距离带有定位祖先元素的位置 ●获得元素自身的大小&#xff08;宽度高度&#xff09; ●注意&#xff1a;返回的…

【49】AndroidStudio构建其他人开发的Android项目

(1)做Android软件开发&#xff0c;通常会看一些其他人开发的项目源码&#xff0c;当将这些项目的源码通过git clone到本地之后&#xff0c;用AndroidStudio进行打开时&#xff0c;通常会遇到一些环境配置的问题。本文即用来记录在构建他人开发项目源代码这一过程中遇到的一些常…

LLama系列模型简要概述

LLama-1&#xff08;7B, 13B, 33B, 65B参数量&#xff1b;1.4T tokens训练数据量&#xff09; 要做真正Open的AI Efficient&#xff1a;同等预算下&#xff0c;增大训练数据&#xff0c;比增大模型参数量&#xff0c;效果要更好 训练数据&#xff1a; 书、Wiki这种量少、质量高…

22. Three.js案例-创建旋转的圆环面

22. Three.js案例-创建旋转的圆环面 实现效果 知识点 WebGLRenderer (WebGL渲染器) THREE.WebGLRenderer 是Three.js中最常用的渲染器&#xff0c;用于将场景渲染到WebGL画布上。 构造器 new THREE.WebGLRenderer(parameters) 参数类型描述parametersObject可选参数对象&…

Burp(5)web网页端抓包与app渗透测试

声明&#xff01; 学习视频来自B站up主 泷羽sec 有兴趣的师傅可以关注一下&#xff0c;如涉及侵权马上删除文章&#xff0c;笔记只是方便各位师傅的学习和探讨&#xff0c;文章所提到的网站以及内容&#xff0c;只做学习交流&#xff0c;其他均与本人以及泷羽sec团队无关&…

bsp是板级支持包

里面有很多的针对该型号的板子的函数&#xff0c;可以直接调用&#xff0c;也可以直接在里面。 也可以在vivado的sdk上&#xff0c;看到很多相关文档和寄存器偏移等等。

基于智能合约的医院凭证共享中心路径探析

一、引言 随着医疗行业的不断发展和信息技术的进步&#xff0c;基于智能合约的医疗凭证共享中心解决方案成为了可能。在当今数字化时代&#xff0c;医疗领域面临着诸多挑战&#xff0c;如医疗数据的分散存储、信息共享的不便捷以及凭证管理的复杂性等问题。而智能合约的出现&am…

实验14 RNN的记忆能力和梯度爆炸实验

一 循环神经网络的记忆能力 1.数据集构建 创建了一个DigitSumDataset 类&#xff0c;包括初始化函数init、数据生成函数 generate_data、数据加载函数 load_data、__len__ 方法、__getitem__ 方法。 init函数&#xff1a;接受的参数是data_path&#xff08; 存放数据集的目录…

一文说清flink从编码到部署上线

引言&#xff1a;目前flink的文章比较多&#xff0c;但一般都关注某一特定方面&#xff0c;很少有一个文章&#xff0c;从一个简单的例子入手&#xff0c;说清楚从编码、构建、部署全流程是怎么样的。所以编写本文&#xff0c;自己做个记录备查同时跟大家分享一下。本文以简单的…

IEEE T-RO 软体机器人手指状态估计实现两栖触觉传感

摘要&#xff1a;南方科技大学戴建生院士、林间院士、万芳老师、宋超阳老师团队近期在IEEE T-RO上发表了关于软体机器人手指在两栖环境中本体感知方法的论文。 近日&#xff0c;南方科技大学戴建生院士、林间院士、万芳老师、宋超阳老师团队在机器人顶刊IEEE T-RO上以《Propri…

java类静态初始化死锁问题

问题 前端时间帮同事分析了一个IO线程阻塞问题&#xff0c;该问题导致服务端无法处理任何请求&#xff0c;只能进行重启解决&#xff1b;事发时运维dump了下栈信息&#xff0c;堆栈信息如下图&#xff1a; 从上面可以看到io线程都阻塞于Object.wait()&#xff0c;具体是执行Cl…

厦门凯酷全科技有限公司怎么样?

随着短视频和直播带货的兴起&#xff0c;抖音电商平台迅速崛起&#xff0c;成为众多品牌和商家争夺的新战场。在这个竞争激烈的市场中&#xff0c;如何抓住机遇、实现销售增长&#xff0c;成为了每个企业面临的挑战。厦门凯酷全科技有限公司&#xff08;以下简称“凯酷全”&…

微信小程序uni-app+vue3实现局部上下拉刷新和scroll-view动态高度计算

微信小程序uni-appvue3实现局部上下拉刷新和scroll-view动态高度计算 前言 在uni-appvue3项目开发中,经常需要实现列表的局部上下拉刷新功能。由于网上相关教程较少且比较零散,本文将详细介绍如何使用scroll-view组件实现这一功能,包括动态高度计算、下拉刷新、上拉加载等完整…

在Windows和Ubuntu上安装SDKMAN

文章目录 1. SDKMAN概述2. 安装与使用SDKMAN2.1 在Windows上安装SDKMAN2.1.1 安装Git for Windows2.1.2 安装SDKMAN 2.2 利用SDKMAN管理Java2.2.1 查看所有可用的OpenJDK发行版2.2.2 安装Java2.2.3 查看Java版本2.2.4 shell指定使用某个Java版本 2.3 在Ubuntu上安装SDKMAN2.3.1…

1210 作业

思维导图 作业 使用read和write函数拷贝文件&#xff0c;一半拷进一个文件&#xff0c;另一半拷进另一个文件 #include <myhead.h> int main(int argc, const char *argv[]) {int fd1 open("./z1.txt",O_RDONLY);if(fd1-1){perror("open");return…

牛客网热门Java面试题及答案整理(2024最新版)

当今互联网行业中&#xff0c;Java 作为一种广泛应用的编程语言&#xff0c;对于求职者来说仍是一项受欢迎的技能。然而&#xff0c;随着市场上的开发人员数量越来越多&#xff0c;Java 面试的竞争也愈加激烈。 目前 Java 面试有着以下现状&#xff1a; 面试难度加大与过去相…