Skip to content

Commit 7d185a6

Browse files
authored
Merge pull request #272 from zhy1985555/master
merge
2 parents 27fc8e1 + d46ce19 commit 7d185a6

File tree

2 files changed

+39
-29
lines changed

2 files changed

+39
-29
lines changed

qcloud_cos/cos_client.py

Lines changed: 38 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -228,6 +228,7 @@ class CosS3Client(object):
228228
"""cos客户端类,封装相应请求"""
229229

230230
__built_in_sessions = None # 内置的静态连接池,多个Client间共享使用
231+
__built_in_pid = 0
231232

232233
def __init__(self, conf, retry=1, session=None):
233234
"""初始化client对象
@@ -239,38 +240,19 @@ def __init__(self, conf, retry=1, session=None):
239240
self._conf = conf
240241
self._retry = retry # 重试的次数,分片上传时可适当增大
241242

242-
if not CosS3Client.__built_in_sessions:
243-
with threading.Lock():
244-
if not CosS3Client.__built_in_sessions: # 加锁后double check
245-
CosS3Client.__built_in_sessions = self.generate_built_in_connection_pool(self._conf._pool_connections, self._conf._pool_maxsize)
246-
247243
if session is None:
244+
if not CosS3Client.__built_in_sessions:
245+
with threading.Lock():
246+
if not CosS3Client.__built_in_sessions: # 加锁后double check
247+
CosS3Client.__built_in_sessions = self.generate_built_in_connection_pool(self._conf._pool_connections, self._conf._pool_maxsize)
248+
CosS3Client.__built_in_pid = os.getpid()
249+
248250
self._session = CosS3Client.__built_in_sessions
251+
self._use_built_in_pool = True
252+
logger.info("bound built-in connection pool when new client. maxsize=%d,%d" % (self._conf._pool_connections, self._conf._pool_maxsize))
249253
else:
250254
self._session = session
251-
252-
def set_built_in_connection_pool_max_size(self, PoolConnections, PoolMaxSize):
253-
"""设置SDK内置的连接池的连接大小,并且重新绑定到client中"""
254-
if not CosS3Client.__built_in_sessions:
255-
return
256-
257-
if CosS3Client.__built_in_sessions.get_adapter('http://')._pool_connections == PoolConnections \
258-
and CosS3Client.__built_in_sessions.get_adapter('http://')._pool_maxsize == PoolMaxSize:
259-
return
260-
261-
# 判断之前是否绑定到内置连接池
262-
rebound = False
263-
if self._session and self._session is CosS3Client.__built_in_sessions:
264-
rebound = True
265-
266-
# 重新生成内置连接池
267-
CosS3Client.__built_in_sessions.close()
268-
CosS3Client.__built_in_sessions = self.generate_built_in_connection_pool(PoolConnections, PoolMaxSize)
269-
270-
# 重新绑定到内置连接池
271-
if rebound:
272-
self._session = CosS3Client.__built_in_sessions
273-
logger.info("rebound built-in connection pool success. maxsize=%d,%d" % (PoolConnections, PoolMaxSize))
255+
self._use_built_in_pool = False
274256

275257
def generate_built_in_connection_pool(self, PoolConnections, PoolMaxSize):
276258
"""生成SDK内置的连接池,此连接池是client间共用的"""
@@ -279,7 +261,30 @@ def generate_built_in_connection_pool(self, PoolConnections, PoolMaxSize):
279261
built_in_sessions.mount('https://', requests.adapters.HTTPAdapter(pool_connections=PoolConnections, pool_maxsize=PoolMaxSize))
280262
logger.info("generate built-in connection pool success. maxsize=%d,%d" % (PoolConnections, PoolMaxSize))
281263
return built_in_sessions
282-
264+
265+
def handle_built_in_connection_pool_by_pid(self):
266+
if not CosS3Client.__built_in_sessions:
267+
return
268+
269+
if not self._use_built_in_pool:
270+
return
271+
272+
if CosS3Client.__built_in_pid == os.getpid():
273+
return
274+
275+
with threading.Lock():
276+
if CosS3Client.__built_in_pid == os.getpid(): # 加锁后double check
277+
return
278+
279+
# 重新生成内置连接池
280+
CosS3Client.__built_in_sessions.close()
281+
CosS3Client.__built_in_sessions = self.generate_built_in_connection_pool(self._conf._pool_connections, self._conf._pool_maxsize)
282+
CosS3Client.__built_in_pid = os.getpid()
283+
284+
# 重新绑定到内置连接池
285+
self._session = CosS3Client.__built_in_sessions
286+
logger.info("bound built-in connection pool when new processor. maxsize=%d,%d" % (self._conf._pool_connections, self._conf._pool_maxsize))
287+
283288
def get_conf(self):
284289
"""获取配置"""
285290
return self._conf
@@ -360,6 +365,10 @@ def send_request(self, method, url, bucket, timeout=30, cos_request=True, ci_req
360365
if self._conf._allow_redirects is not None:
361366
kwargs['allow_redirects'] = self._conf._allow_redirects
362367
exception_logbuf = list() # 记录每次重试的错误日志
368+
369+
# 切换了进程需要重新生成连接池
370+
self.handle_built_in_connection_pool_by_pid()
371+
363372
for j in range(self._retry + 1):
364373
try:
365374
if j != 0:

setup.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
from setuptools import setup, find_packages
44
from platform import python_version_tuple
5+
import sys
56
import io
67
import sys
78

0 commit comments

Comments
 (0)