Skip to content

Использовать ресурсы #25

Closed
@Masynchin

Description

В чём проблема?

Сервисы (в частности, БД подписчиков и API погоды) создают ресурсы при каждом запросе:

  • Создание соединения к БД для каждого запроса:

CheWeatherBot/app/db.py

Lines 31 to 36 in df8ac22

async def add(self, user_id, mailing_time):
"""Регистрация в БД нового подписчика рассылки"""
async with async_session() as session:
subscriber = Subscriber(id=user_id, mailing_time=mailing_time)
session.add(subscriber)
await session.commit()

  • Создание сессии aiohttp.ClientSession для каждого запроса:

@alru_cache(maxsize=1)
async def _get_weather(url, time):
"""Кешированный прогноз погоды в виде WeatherResponse"""
async with aiohttp.ClientSession() as session:
async with session.get(url) as response:
data = await response.json()
return WeatherResponse(**data)

Решение?

Аллоцировать ресурсы в main один раз, и единожды передавать их в сервисы, примерно так:

async def main():
    async with db.connect(...) as conn, aiohttp.ClientSession(...) as session:
        subs = Subscribers(conn)
        weather = OwmWeather(session)

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions