以前对于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. JS中的拖动之—— ondragstart,ondrag,ondragend , ondragenter , ondragover , ondragleave, ondrop 的区别

    关于 HTML5 中的拖动功能. 更多信息可以查看我们 HTML 教程中的 HTML5 拖放.以下 我只做一下简介. 1 如果你想让元素变得可拖动,首先 你得对元素设置 draggable 属性 此属 ...

  2. Angular待办事项应用2

    todo组件 接上一篇,在根目录创建todo组件 命令行输入:ng g c todo 得到 文件结构 修改默认路由为todo: 然后打开浏览器:http://localhost:4200/ ,查看,t ...

  3. 使用Repeater控件实现三层嵌套以及分页效果

    PS: 第一次用Repeater控件 记录一下 请忽略我的命名不规范  请忽略我的最终效果图(太丑了) 需要用到的朋友可以自行调整的漂亮点 ====================最终效果图===== ...

  4. spring定时任务(@Scheduled注解)

    (一)在xml里加入task的命名空间 xmlns:task="http://www.springframework.org/schema/task" http://www.spr ...

  5. SpringMVC的controller层接收来自jsp页面通过<a href="/user/userUpdateInfo/>的中文乱码问题

    这种情况是,jsp页面的中文正常显示,数据的中文也是正常显示,但是在Controller层接收到的中文是乱码,如下图所示: 解决方法:在Controller层对前台传递的中文乱码进行处理,将它转换成u ...

  6. Struts框架的执行流程或原理

    Struts2的执行流程如下: 1.浏览器发送请求,经过一系列的过滤器,到达StrutsPreapareAndExecteFilter 2.StrutsPrepareAndExectueFilter通 ...

  7. vue 实现父组件和子组件之间的数据双向绑定

    前言:vue 实现父组件给子组件传值,然后子组件可以修改回父组件的值.vue 的 prop 默认是单向数据绑定,但是偶尔需要双向绑定,这时就需要知道如何才能让子组件的数据修改时影响到父组件的数据.转载 ...

  8. 给model模型传数组参数

    $res = $this->Company->companyDischarge($this->user_id,array(0=>'c.limit_sum>0',1=> ...

  9. python学习之老男孩python全栈第九期_第二周学习总结

    迭代器 双下方法:很少直接调用的方法,一般情况下,是通过其他语法触发的 1. 可迭代的 --> 可迭代协议:含有__iter__的方法( '__iter__' in dir(数据) ) 可迭代的 ...

  10. mysql if()

    类似三元运算符 ,"男","女") 结果: