如何详细构建Python Requests的高效长连接池?

2026-05-26 20:461阅读0评论SEO资讯
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计747个文字,预计阅读时间需要3分钟。

如何详细构建Python Requests的高效长连接池?

前文:近期在全面更新全网CDN系统时,发现性能调优过程中遇到了requests长连接的一个问题。之前关注过长连接过多导致浪费的议题,但由于系统都是分布式扩展的,针对这类问题进展缓慢。

前文:

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

服务端接收的a.xiaorui.cc/1') r = s.get('a.xiaorui.cc/2') r = s.get('a.xiaorui.cc/3')

我们可以看到该进程只实例化了一个长连接。

# xiaorui.cc python 27173 root 2u CHR 136,11 0t0 14 /dev/pts/11 python 27173 root 3u IPv4 27212480 0t0 TCP 101.200.80.162:36090->220.181.105.185:', HTTPAdapter()) # 如果没有单独配置adapter适配器,那么就临时配置一个小适配器 self.mount('', HTTPAdapter()) # 根据schema来分配不同的适配器adapter,上面是google.com/mail/') Url(scheme='http', host='google.com', port=None, path='/mail/', ...) >>> parse_url('google.com:80') Url(scheme=None, host='google.com', port=80, path=None, ...) >>> parse_url('/foo?bar') Url(scheme=None, host=None, port=None, path='/foo', query='bar', ...) return Url(scheme, auth, host, port, path, query, fragment) # 获取匹配的长连接 def connection_from_url(self, url, pool_kwargs=None): u = parse_url(url) return self.connection_from_host(u.host, port=u.port, scheme=u.scheme, pool_kwargs=pool_kwargs) # 获取匹配host的长连接 def connection_from_host(self, host, port=None, scheme='http', pool_kwargs=None): if scheme == "https": return super(ProxyManager, self).connection_from_host( host, port, scheme, pool_kwargs=pool_kwargs) return super(ProxyManager, self).connection_from_host( self.proxy.host, self.proxy.port, self.proxy.scheme, pool_kwargs=pool_kwargs) # 根据url的三个指标获取连接 def connection_from_pool_key(self, pool_key, request_context=None): with self.pools.lock: pool = self.pools.get(pool_key) if pool: return pool scheme = request_context['scheme'] host = request_context['host'] port = request_context['port'] pool = self._new_pool(scheme, host, port, request_context=request_context) self.pools[pool_key] = pool return pool # 获取长连接的主入口 def urlopen(self, method, url, redirect=True, **kw): u = parse_url(url) conn = self.connection_from_host(u.host, port=u.port, scheme=u.scheme)

这里为止,Python requests关于session连接类实现,说的算明白了。 但就requests和urllib3的连接池实现来说,还是有一些提升空间的。 但问题来了,单单靠着域名和端口会造成一些问题,至于造成什么样子的问题,我在上面已经有详细的描述了。

那么如何解决?

我们可以用 scheme + 主domain + host_ip + port 来实现长连接池的管理。

如何详细构建Python Requests的高效长连接池?

其实大多数的场景是无需这么细致的实现连接池的,但根据我们的测试的结果来看,在服务初期性能提升还是不小的。

这样既解决了域名ip轮询带来的连接重置问题,也解决了多级域名下不能共用连接的问题。

以上这篇构建高效的python requests长连接池详解就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持易盾网络。

本文共计747个文字,预计阅读时间需要3分钟。

如何详细构建Python Requests的高效长连接池?

前文:近期在全面更新全网CDN系统时,发现性能调优过程中遇到了requests长连接的一个问题。之前关注过长连接过多导致浪费的议题,但由于系统都是分布式扩展的,针对这类问题进展缓慢。

前文:

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

服务端接收的a.xiaorui.cc/1') r = s.get('a.xiaorui.cc/2') r = s.get('a.xiaorui.cc/3')

我们可以看到该进程只实例化了一个长连接。

# xiaorui.cc python 27173 root 2u CHR 136,11 0t0 14 /dev/pts/11 python 27173 root 3u IPv4 27212480 0t0 TCP 101.200.80.162:36090->220.181.105.185:', HTTPAdapter()) # 如果没有单独配置adapter适配器,那么就临时配置一个小适配器 self.mount('', HTTPAdapter()) # 根据schema来分配不同的适配器adapter,上面是google.com/mail/') Url(scheme='http', host='google.com', port=None, path='/mail/', ...) >>> parse_url('google.com:80') Url(scheme=None, host='google.com', port=80, path=None, ...) >>> parse_url('/foo?bar') Url(scheme=None, host=None, port=None, path='/foo', query='bar', ...) return Url(scheme, auth, host, port, path, query, fragment) # 获取匹配的长连接 def connection_from_url(self, url, pool_kwargs=None): u = parse_url(url) return self.connection_from_host(u.host, port=u.port, scheme=u.scheme, pool_kwargs=pool_kwargs) # 获取匹配host的长连接 def connection_from_host(self, host, port=None, scheme='http', pool_kwargs=None): if scheme == "https": return super(ProxyManager, self).connection_from_host( host, port, scheme, pool_kwargs=pool_kwargs) return super(ProxyManager, self).connection_from_host( self.proxy.host, self.proxy.port, self.proxy.scheme, pool_kwargs=pool_kwargs) # 根据url的三个指标获取连接 def connection_from_pool_key(self, pool_key, request_context=None): with self.pools.lock: pool = self.pools.get(pool_key) if pool: return pool scheme = request_context['scheme'] host = request_context['host'] port = request_context['port'] pool = self._new_pool(scheme, host, port, request_context=request_context) self.pools[pool_key] = pool return pool # 获取长连接的主入口 def urlopen(self, method, url, redirect=True, **kw): u = parse_url(url) conn = self.connection_from_host(u.host, port=u.port, scheme=u.scheme)

这里为止,Python requests关于session连接类实现,说的算明白了。 但就requests和urllib3的连接池实现来说,还是有一些提升空间的。 但问题来了,单单靠着域名和端口会造成一些问题,至于造成什么样子的问题,我在上面已经有详细的描述了。

那么如何解决?

我们可以用 scheme + 主domain + host_ip + port 来实现长连接池的管理。

如何详细构建Python Requests的高效长连接池?

其实大多数的场景是无需这么细致的实现连接池的,但根据我们的测试的结果来看,在服务初期性能提升还是不小的。

这样既解决了域名ip轮询带来的连接重置问题,也解决了多级域名下不能共用连接的问题。

以上这篇构建高效的python requests长连接池详解就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持易盾网络。