Skip to content

Commit b092e11

Browse files
author
kevin
committed
refactor: restore thread safety for aio session and simplify exception handling
1 parent 956fba3 commit b092e11

3 files changed

Lines changed: 18 additions & 20 deletions

File tree

dashscope/api_entities/aio_session.py

Lines changed: 16 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
"""
99
import asyncio
1010
import ssl
11+
import threading
1112
import weakref
1213
from typing import Optional
1314

@@ -16,14 +17,15 @@
1617

1718
_shared_ssl_context: Optional[ssl.SSLContext] = None
1819
_aio_sessions: "weakref.WeakKeyDictionary" = weakref.WeakKeyDictionary()
19-
20+
_lock = threading.RLock()
2021

2122
def get_ssl_context() -> ssl.SSLContext:
2223
global _shared_ssl_context
23-
if _shared_ssl_context is None:
24-
_shared_ssl_context = ssl.create_default_context(
25-
cafile=certifi.where(),
26-
)
24+
with _lock:
25+
if _shared_ssl_context is None:
26+
_shared_ssl_context = ssl.create_default_context(
27+
cafile=certifi.where(),
28+
)
2729
return _shared_ssl_context
2830

2931

@@ -36,19 +38,21 @@ async def get_shared_aio_session() -> aiohttp.ClientSession:
3638
"""
3739
loop = asyncio.get_running_loop()
3840

39-
session = _aio_sessions.get(loop)
40-
if session is not None and not session.closed:
41-
return session
41+
with _lock:
42+
session = _aio_sessions.get(loop)
43+
if session is not None and not session.closed:
44+
return session
4245

43-
connector = aiohttp.TCPConnector(ssl=get_ssl_context())
44-
session = aiohttp.ClientSession(connector=connector)
45-
_aio_sessions[loop] = session
46+
connector = aiohttp.TCPConnector(ssl=get_ssl_context())
47+
session = aiohttp.ClientSession(connector=connector)
48+
_aio_sessions[loop] = session
4649
return session
4750

4851

4952
async def close_shared_aio_session() -> None:
5053
"""Close the shared session for the current event loop."""
5154
loop = asyncio.get_running_loop()
52-
session = _aio_sessions.pop(loop, None)
55+
with _lock:
56+
session = _aio_sessions.pop(loop, None)
5357
if session is not None and not session.closed:
5458
await session.close()

dashscope/api_entities/aiohttp_request.py

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -297,9 +297,6 @@ async def _handle_request(self):
297297
async with response:
298298
async for rsp in self._handle_response(response):
299299
yield rsp
300-
except aiohttp.ClientConnectorError as e:
301-
logger.error(e)
302-
raise e
303300
except Exception as e:
304301
logger.error(e)
305302
raise e

dashscope/api_entities/http_request.py

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -218,10 +218,7 @@ async def _handle_aio_request(self): # pylint: disable=too-many-branches
218218
async with response:
219219
async for rsp in self._handle_aio_response(response):
220220
yield rsp
221-
except aiohttp.ClientConnectorError as e:
222-
logger.error(e)
223-
raise e
224-
except BaseException as e:
221+
except Exception as e:
225222
logger.error(e)
226223
raise e
227224

@@ -507,6 +504,6 @@ def _handle_request(self): # pylint: disable=too-many-branches
507504
# Only close if we created the session
508505
if should_close:
509506
session.close()
510-
except BaseException as e:
507+
except Exception as e:
511508
logger.error(e)
512509
raise e

0 commit comments

Comments
 (0)