问题背景
一个简单的需求是,向一个 host 地址+端口定时 post 一定量数据,程序使用 requests 的 post 方式,傻瓜式同步执行,因为没有时间限制。但是在执行后出现:
1 | TimeoutError: [Errno 110] Connection timed out |
显示连接超时了,程序每次运行 post 了大概500条数据,而这个错误只会出现一次,猜测可能是 HTTP 短连接的问题。
解决方案
其实对于 向同一主机发送多个请求 这种场景,使用 HTTP 的长连接效率会更高,复用底层的 TCP 连接。Requests 库同样提供了这样的方式,即会话对象 - Session ,使用方式如下:
1 | s = requests.Session() |
源码如下:
1 | class Session(SessionRedirectMixin): |
默认情况下,Session 连接池大小为10,请求失败重试次数为0,但是一般情况下我们会需要稍大容量的连接池,从源码中可以看到,session 绑定了 HTTPAdapter
对象,所以我们可以自定义一个符合预期参数的 HTTPAdapter
对象。
1 | def get_http_session(self, pool_connections, pool_maxsize, max_retries): |
然后就可以使用 session 的各个功能了。So Easy!
Read More: