如何构建高效的python请求长连接池

  介绍

小编这次要给大家分享的是如何构建高效的python请求长连接池,文章内容丰富,感兴趣的小伙伴可以来了解一下,希望大家阅读完这篇文章之后能够有所收获。

<强>前文:

最近在搞全网的CDN刷新系统,在性能调优时遇到了请求长连接的一个问题,以前关注过长连接太多造成浪费的问题,但因为系统都是分布式扩展的,针对这种各别问题就懒得改动了。现在开发的缓存刷新系统,对于性能还是有些敏感的,我后面会给出最优的http长连接池构建方式。

<强>老生常谈:

python下的httpclient库哪个最好用吗?我想大多数人还是会选择请求库的。原因么?也就是简单,易用!

<>强如何蛋疼的构建reqeusts的短连接请求:

请求python库默认就是长连接的(http 1.1、连接:保持活着),如果单纯在请求头部去掉连接是不靠谱的,还需要借来的助httplib的配合。

s=requests.Session ()

del s.headers[& # 39;连接# 39;]

正确发起http 1.0的请求姿势是:

# xiaorui.cc      进口httplib   进口的要求      httplib.HTTPConnection。_http_vsn=10   httplib.HTTPConnection。_http_vsn_str=& # 39; HTTP/1.0 & # 39;      r=requests.get (& # 39; http://127.0.0.1:8888 & # 39;)

服务端接收的http包体内容:

/HTTP/1.0
  接受编码:gzip压缩
  接受:*/*
  用户代理:python-requests//2.7.10达尔文2.5.1 CPython 15.4.0 

所谓短连接就是发送HTTP 1.0协议,这样web服务端当然会在发送完数据后,触发关闭(),也就是传递\ 0字符串,达到关闭连接!这里还是要吐槽一下,好多人天天说系统优化,连个基本的网络io都不优化,你还想干嘛……下面我们依次聊请求长连接的各种问题及性能优化。

<强>那么请求长连接如何实现?

请求给我们提供了一个会话的长连接类,他不仅仅能实现最基本的长连接保持,还会附带服务端返回的饼干数据。在底层是如何实现的?

把HTTP 1.0改成HTTP 1.1就可以了,如果你标明了是HTTP 1.1,那么有没有连接:保活都无所谓的。如果HTTP 1.0加上连接:维生,那么服务器会认为你是长连接。就这么简单!

调查([=波淋}{fd=5,事件),1,0)=0(超时)
  sendto(5,“得到/HTTP/1.1 \ r \ nHost: www.xiaorui.cc \ r \ nConnection:维生\ r \ nAccept-Encoding: gzip、缩小\ r \ nAccept: */* \ r \ nUser-Agent: python-requests/2.9.1 \ r \ n \ r \ n", 144 0, NULL, 0)=144
  F_GETFL fcntl(5日)=0 x2(旗帜O_RDWR)
  fcntl (5 F_SETFL O_RDWR)=0 

会话的长连接支持多个主机么?也就是我在一个服务里先后访问a.com, b.com, c.com那么请求会话能否帮我保持连接,# 63;

答案很明显,当然是可以的!

但也仅仅是可以一用,但他的实现有很多的槽点,比如xiaorui。cc的主机上还有多个虚拟主机,那么会出现什么情况么?会不停的创建新连接,因为reqeusts的urllib3连接池管理是基于主机的,这个主机可能是域名,也可能ip地址,具体是什么,要看你的输入。

 strace - p 25449 - e跟踪=连接
  25449连接中断退出过程
  连接(13日{sa_family=AF_INET sin_port=htons (80), sin_addr=inet_addr (“61.216.13.196")}, 16)=0
  连接(8,{sa_family=AF_INET sin_port=htons (53), sin_addr=inet_addr (“10.202.72.116")}, 16)=0
  连接(8,{sa_family=AF_INET sin_port=htons (80), sin_addr=inet_addr (“125.211.204.141")}, 16)=0
  连接(8,{sa_family=AF_UNSPEC sa_data=https://www.yisu.com/zixun/"/0/0/0/0/0/0/0/0/0/0/0/0/0/0 "}, 16)=0
  连接(8,{sa_family=AF_INET sin_port=htons (80), sin_addr=inet_addr (153.37.238.190)}, 16)=0
  连接(8,{sa_family=AF_UNSPEC sa_data="/0/0/0/0/0/0/0/0/0/0/0/0/0/0 "}, 16)=0
  连接(8,{sa_family=AF_INET sin_port=htons (80), sin_addr=inet_addr (157.255.128.103)}, 16)=0
  连接(8,{sa_family=AF_UNSPEC sa_data="/0/0/0/0/0/0/0/0/0/0/0/0/0/0 "}, 16)=0
  连接(8,{sa_family=AF_INET sin_port=htons (80), sin_addr=inet_addr (139.215.203.190)}, 16)=0
  连接(8,{sa_family=AF_UNSPEC sa_data="/0/0/0/0/0/0/0/0/0/0/0/0/0/0 "}, 16)=0
  连接(8,{sa_family=AF_INET sin_port=htons (80), sin_addr=inet_addr (42.56.76.104)}, 16)=0
  连接(8,{sa_family=AF_UNSPEC sa_data="/0/0/0/0/0/0/0/0/0/0/0/0/0/0 "}, 16)=0
  连接(8,{sa_family=AF_INET sin_port=htons (80), sin_addr=inet_addr (42.236.125.104)}, 16)=0
  连接(8,{sa_family=AF_UNSPEC sa_data="/0/0/0/0/0/0/0/0/0/0/0/0/0/0 "}, 16)=0
  连接(8,{sa_family=AF_INET sin_port=htons (80), sin_addr=inet_addr (110.53.246.11)}, 16)=0
  连接(8,{sa_family=AF_UNSPEC sa_data="/0/0/0/0/0/0/0/0/0/0/0/0/0/0 "}, 16)=0
  连接(8,{sa_family=AF_INET sin_port=htons (80), sin_addr=inet_addr (36.248.26.191)}, 16)=0
  连接(8,{sa_family=AF_UNSPEC sa_data="/0/0/0/0/0/0/0/0/0/0/0/0/0/0 "}, 16)=0
  连接(8,{sa_family=AF_INET sin_port=htons (80), sin_addr=inet_addr (125.211.204.151)}, 16)=0 

如何构建高效的python请求长连接池