以前对于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. Vertica添加磁盘

    本次实验环境是在虚拟机上 Vmware 12 操作系统是Centos 6.5 64位 1. 首先停止节点上的Vertica数据库,具体方法有很多 admintools -t stop_node -s ...

  2. 腾讯云CentOS安装JDK1.8

    购买了腾讯云CentOS7系统,尝试搭建一个博客平台,首先要安装JDK. 一开始尝试用本地FTP上传JDK包到服务器,速度太慢,只有10K左右,放弃. 然后决定在服务器直接下载JDK进行安装. 执行 ...

  3. js小练习

    1.题目:某班的成绩出来了,现在老师要把班级的成绩打印出来. 效果如下:xxx年xx月x日  星期x--班级总分为:81 格式要求:1.显示打印的日期.格式为类似“xxxx年xx月xx日 星期x”的当 ...

  4. MarkDownPad 专业汉化破解

     解压Pa_ttrar 运行Pa_ttrar.exe    点击下边第一个按钮“patch”——>弹出窗选择“YES”  选择“YES”后会选择一个文件,找到“C:\Users\用户名\AppD ...

  5. Matlab给三维点云添加高斯噪声和随机噪声

    写在前面 在我们进行点云配准一类的模拟实验时,第一步就是对原始点云进行适当的RT变换,并添加一定的噪声,得到测量点云,然后才可以用我们的算法去进行后面的配准操作.在添加噪声这一块,matlab里并没有 ...

  6. 转:nginx 官方drupal 配置 - Drupal | NGINX

    #参考:nginx 官方drupal 配置 - Drupal | NGINX server { server_name example.com; root /var/www/drupal8; ## & ...

  7. ubuntu命令行编译opencv c++项目

    ubuntu终端编译opencv c++项目: g++ test.cpp `pkg-config opencv --libs --cflags opencv` -o test

  8. 深入解析 ERP 计划的各个层次

    ERP 生产计划管理按照 ERP 计划的层次主要分为:经营规划.销售和运作规划.主生产计划.物料需求计划.能力需求计划.执行能力计划.执行物料计划等. 经营规划是企业的战略规划,用于确定企业经营目标和 ...

  9. 润乾报表JSF FORM 标签中使用填报表解决方案

     需求 润乾报表的标签需要在jsf页面中和其他填报控件一起使用,润乾报表负责展现录入部分数据,并且这部分数据和页面的其它控件的数据存在前台和后台的交互. 问题 润乾报表在前台会生成自己的form, ...

  10. JSON学习笔记-4

    JSON 数组 1.访问数组 1.一次访问一个嵌套内容值var myObj, x; myObj = { "name":"网站", , "sites&q ...