以前对于Requests库只是简单是使用,在现在公司的后台中,有多个接口是直接使用requests.get .post之类的方法来做的,进行过一段时间的压力测试,发现性能低的可怜,且linux服务器有好多CLOSE_WAIT状态,所以这个问题不解决是没办法上线的。

  解决办法参考以下方法(下文附连接):

    第一篇说了:requests 库自己会处理好连接池的问题,且访问完成之后是会有SOCKET 的CLOSE_WAIT状态,这个是正常的,后续会直接复用这些连接(CLOSE_WAIT状态直接使用在多线程环境下不会复用,这里是一个大坑,下文第三篇说明了解决办法),但值得注意的是CLOSE_WAIT状态如果非常多,且一直存在,就需要思考哪里出了问题,可能因为并发太高出错,或者没有调用resp.close方法,因为没有读取完响应是不会释放连接的。

    第二篇说了:直接.get .post得不到任何好处,因为每次他都会创建一个连接池,而这个连接池你却只用了一次。所以,如果想要用requests库的连接池功能,需要使用全局session,且自己构造好HttpAdapter实例,session.mount上就可以了,并发大的时候才会有效果。

    第三篇说了:使用连接池的时候不是任何时候都有效,仅当你使用了多线程之类的并发才有效果,如果你是单线程的,那么你将不会得到连接池的任何好处,因为单线程里面是串行的,就是说一个线程对应一个连接。此外,里面还说了HttpAdapter的俩个参数的含义:pool_connections, 是指你的后台程序最多连接多少个不同的主机;pool_maxsize, 是指针对每个主机你能创建的连接最大有多少个(底层TCP)。注,这里不是初始多少个和最大多少个的意思!!!

    pool_maxsize针对不同的HOST,每个HOST是独立的连接池,所以如果我们后台程序连接了多台服务器,用pool_connections参数指定最大个数,pool_maxsize指定每个后台主机最大多少个链接,且又由于一个线程一个连接的因素,因此我们服务器程序有多少个线程pool_maxsize就指定多少。

  注,由于http解析较慢,后台服务器之间不应使用它作为服务器之间的通信协议,但这是前人的基础上改的,没办法,只能逐步优化。

  此外,改善完之后,性能增长增长不是很明显,且发现CPU占用率不高,此时可以增加进程数和线程数来提高并发数和用户请求等待时间,因为这很可能是因为我们的后台程序是严重的IO密集型应用,大部分时间都在等待,例如等待http响应

参考:

https://github.com/kennethreitz/requests/issues/1973

https://blog.hubert.tw/2014/02/08/use-connection-pool-in-python-requests/

https://laike9m.com/blog/requests-secret-pool_connections-and-pool_maxsize,89/

【原创】python requests 库底层Sockets处于close_wait状态的更多相关文章

  1. 大概看了一天python request源码。写下python requests库发送 get,post请求大概过程。

    python requests库发送请求时,比如get请求,大概过程. 一.发起get请求过程:调用requests.get(url,**kwargs)-->request('get', url ...

  2. python requests库学习笔记(上)

    尊重博客园原创精神,请勿转载! requests库官方使用手册地址:http://www.python-requests.org/en/master/:中文使用手册地址:http://cn.pytho ...

  3. Python——Requests库的开发者接口

    本文介绍 Python Requests 库的开发者接口,主要内容包括: 目录 一.主要接口 1. requests.request() 2. requests.head().get().post() ...

  4. 使用python requests库写接口自动化测试--记录学习过程中遇到的坑(1)

    一直听说python requests库对于接口自动化测试特别合适,但由于自身代码基础薄弱,一直没有实践: 这次赶上公司项目需要,同事小伙伴们一起学习写接口自动化脚本,听起来特别给力,赶紧实践一把: ...

  5. Python:requests库、BeautifulSoup4库的基本使用(实现简单的网络爬虫)

    Python:requests库.BeautifulSoup4库的基本使用(实现简单的网络爬虫) 一.requests库的基本使用 requests是python语言编写的简单易用的HTTP库,使用起 ...

  6. Python requests库的使用(一)

    requests库官方使用手册地址:http://www.python-requests.org/en/master/:中文使用手册地址:http://cn.python-requests.org/z ...

  7. python requests库学习笔记(下)

    1.请求异常处理 请求异常类型: 请求超时处理(timeout): 实现代码: import requestsfrom requests import exceptions        #引入exc ...

  8. Python requests库的使用(二)

    1.请求异常处理 请求异常类型: 请求超时处理(timeout): 实现代码: import requestsfrom requests import exceptions        #引入exc ...

  9. Python Requests库:HTTP for Humans

    Python标准库中用来处理HTTP的模块是urllib2,不过其中的API太零碎了,requests是更简单更人性化的第三方库. 用pip下载: pip install requests 或者git ...

随机推荐

  1. ObjectMapper将json转对象报错处理

    在使用ObjectMapper将json转对象,调用mapper.readValue(jsonStr, XwjUser.class)时,报如下错: com.fasterxml.jackson.data ...

  2. MFC数据库操作

    本例采用Microsoft SQL2008建立的一个数据库表 /****链接数据库操作**/ 在stdafx.h的头文件中加入 #import "C:\Program Files\Commo ...

  3. 利用SignalR来同步更新Winfrom小试

    之前写了个用Socket来更新多个Winfrom的试例,这两天看了下SignalR,也用这个来试一下 SignalR 地址:https://www.asp.net/signalr 我这个也是基于 ht ...

  4. Java中使用json时java.lang.NoClassDefFoundError: net/sf/ezmorph/Morpher问题解决

    下面代码: public static void main(String[] args) { JSONObject obj = new JSONObject(); obj.put("msg& ...

  5. Xcode 8 媒体权限

  6. cv程序员的日常_1

    某天pom文件粘贴报红 然后我就问我同事 然后我就百度 https://blog.csdn.net/guoyiyun_tz/article/details/82115024 看完之后…emmmm没错啊 ...

  7. ajax对服务器返回xml的处理过程

    客户端:<script type="text/javascript">    function getXml(){        var name = $(" ...

  8. Hibernate的一对多实例

    一对多在现实生活中很常见,今天做了个Hibernate的一对多的实例,也是个入门过程,写下来跟大家分享. 最重要的是xml配置文件,之前因为把英文"(引号)错误的复制成中文的“”(引号),导 ...

  9. Vue如何使用动态刷新Echarts组件

    这次给大家带来Vue如何使用动态刷新Echarts组件,Vue使用动态刷新Echarts组件的注意事项有哪些,下面就是实战案例,一起来看一下. 需求背景:dashboard作为目前企业中后台产品的“门 ...

  10. Django中间件解析

    一,中间件的概念 django 中的中间件(middleware),在django中,中间件其实就是一个类,在请求到来和结束后,django会根据自己的规则在合适的时机执行中间件中相应的方法.在dja ...