diff --git a/solution.py b/solution.py index 285ed47..8810b32 100644 --- a/solution.py +++ b/solution.py @@ -59,24 +59,34 @@ async def get_records_count(session, server) -> int: return count -async def get_tasks(cfg: Config, session: aiohttp.ClientSession, count, body) -> list: - """Вернет список запросов к API. +async def get_tasks( + url: str, portion: int, count: int, session: aiohttp.ClientSession, body: dict +) -> List[Task]: + """Вернет список задач с запросами к API. Функция не ограничивает кол-во запросов, это нужно сделать до вызова, чтобы передать корректный `session`. + + Parameters + ---------- + url : str + Куда слать запрос. Ожидается "server/get" + portion : int + Сколько записей запрашивать за раз + count : int + Общее количество записей + session : aiohttp.ClientSession + Объект сессии, создается в уровне выше, с одним объектом + меньше накладных расходов на каждый запрос. + body : json + Json для запроса. """ tasks: List[Task] = [] - offset = 0 - url = f"{cfg.central_host_url}/get" - for _ in range(count // cfg.request_portion + 1): - if offset < count: - print(f"{offset=}") - tasks.append(asyncio.create_task(session.get(url, json=body))) - offset += cfg.request_portion - body["offset"] = offset + for offset in range(0, count, portion): + tasks.append(asyncio.create_task(session.get(url, json=body))) + body["offset"] = offset - print(f"{count=}") return tasks @@ -87,14 +97,19 @@ async def send_async_request(cfg: Config, json_body: dict) -> None: # ограничим одновременное число запросов conn = aiohttp.TCPConnector(limit=cfg.requests_count) + url = cfg.central_host_url + portion = cfg.request_portion + async with aiohttp.ClientSession(connector=conn) as session: - # всего записей в базе - count = await get_records_count(session, cfg.central_host_url) + # получаем количесвто записей + count = await get_records_count(session, url) - tasks = await get_tasks(cfg, session, count, json_body) + tasks = await get_tasks(f"{url}/get", portion, count, session, json_body) responses = await asyncio.gather(*tasks) + # Пройдемся по ответам на запросы, запишем файлы конфига для + # каждого respone. Каждый response содержит portion или меньше хостов for response in responses: resp = await response.json() hosts = [i["hostname"] for i in resp.get("result")] @@ -102,8 +117,7 @@ async def send_async_request(cfg: Config, json_body: dict) -> None: def read_config(path_to_conf_file: str, section: str = "Main") -> Config: - """ - Считать конфиг с помощью `configparser`. + """Считать конфиг с помощью `configparser`. Parameters ----------