#!/usr/bin/python
# -*- coding: utf-8 -*-
import logging
import threading
from requests.adapters import HTTPAdapter
from urllib3 import HTTPSConnectionPool, PoolManager, HTTPConnectionPool
logger = logging.getLogger("tencentcloud_sdk_common")
class HTTPSPreConnPool(HTTPSConnectionPool):
_close_signal = {}
def __init__(self, *args, **kwargs):
super(HTTPSPreConnPool, self).__init__(*args, **kwargs)
# clear the pool
for _ in range(self.pool.maxsize):
self.pool.get()
self._conn_producer = threading.Thread(target=self._conn_producer_loop)
self._conn_producer.setDaemon(True)
self._conn_producer.start()
def _conn_producer_loop(self):
while True:
conn = super(HTTPSPreConnPool, self)._new_conn()
conn.connect()
logger.debug("HTTPSPreConnPool: created a new conn")
self.pool.put(conn)
class HTTPPreConnPool(HTTPConnectionPool):
_close_signal = {}
def __init__(self, *args, **kwargs):
super(HTTPPreConnPool, self).__init__(*args, **kwargs)
# clear the pool
for _ in range(self.pool.maxsize):
self.pool.get()
self._conn_producer = threading.Thread(target=self._conn_producer_loop)
self._conn_producer.setDaemon(True)
self._conn_producer.start()
def _conn_producer_loop(self):
while True:
conn = super(HTTPPreConnPool, self)._new_conn()
conn.connect()
logger.debug("HTTPSPreConnPool: created a new conn")
self.pool.put(conn)
class PreConnPoolManager(PoolManager):
def __init__(self, pool_size, *args, **kwargs):
self._pool_size = pool_size
super(PreConnPoolManager, self).__init__(*args, **kwargs)
def _new_pool(self, scheme, host, port, request_context):
if scheme == 'https':
return HTTPSPreConnPool(host, port, maxsize=self._pool_size - 1)
if scheme == 'http':
return HTTPPreConnPool(host, port, maxsize=self._pool_size - 1)
return super(PreConnPoolManager, self)._new_pool(scheme, host, port, request_context)
class PreConnAdapter(HTTPAdapter):
def __init__(self, conn_pool_size, *args, **kwargs):
self._conn_pool_size = conn_pool_size
super(PreConnAdapter, self).__init__(*args, **kwargs)
def init_poolmanager(self, *args, **kwargs):
self.poolmanager = PreConnPoolManager(self._conn_pool_size, *args, **kwargs)