|
|
from aiohttp import ClientSession, ClientTimeout, TCPConnector |
|
|
from asyncio import get_running_loop, run, get_event_loop, Semaphore |
|
|
|
|
|
from scorevision.utils.settings import get_settings |
|
|
|
|
|
_SESSIONS: dict[int, ClientSession] = {} |
|
|
_SEMAPHORES: dict[int, Semaphore] = {} |
|
|
|
|
|
|
|
|
async def _close_all_clients_async(): |
|
|
for sess in list(_SESSIONS.values()): |
|
|
try: |
|
|
if sess and not sess.closed: |
|
|
await sess.close() |
|
|
except Exception: |
|
|
pass |
|
|
_SESSIONS.clear() |
|
|
|
|
|
|
|
|
def close_http_clients(): |
|
|
""" """ |
|
|
try: |
|
|
loop = get_running_loop() |
|
|
except RuntimeError: |
|
|
loop = None |
|
|
|
|
|
if loop and loop.is_running(): |
|
|
loop.create_task(_close_all_clients_async()) |
|
|
else: |
|
|
run(_close_all_clients_async()) |
|
|
|
|
|
|
|
|
def _loop_key() -> int: |
|
|
try: |
|
|
loop = get_running_loop() |
|
|
except RuntimeError: |
|
|
loop = get_event_loop() |
|
|
return id(loop) |
|
|
|
|
|
|
|
|
async def get_async_client() -> ClientSession: |
|
|
settings = get_settings() |
|
|
key = _loop_key() |
|
|
sess = _SESSIONS.get(key) |
|
|
if sess is None or sess.closed: |
|
|
sess = ClientSession( |
|
|
timeout=ClientTimeout(total=settings.SCOREVISION_API_TIMEOUT_S), |
|
|
connector=TCPConnector( |
|
|
limit=0, |
|
|
limit_per_host=0, |
|
|
), |
|
|
) |
|
|
_SESSIONS[key] = sess |
|
|
return sess |
|
|
|
|
|
|
|
|
def get_semaphore() -> Semaphore: |
|
|
settings = get_settings() |
|
|
key = _loop_key() |
|
|
sem = _SEMAPHORES.get(key) |
|
|
if sem is None: |
|
|
cap = max(1, settings.SCOREVISION_MAX_CONCURRENT_API_CALLS) |
|
|
sem = Semaphore(cap) |
|
|
_SEMAPHORES[key] = sem |
|
|
return sem |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|