Browse Source

Рефактор функции формирования запросов

Упростил формирование запросов. Совсем вылетела из головы `range`.
master
Дмитрий 3 years ago
parent
commit
f38d704f7e
  1. 46
      solution.py

46
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
----------

Loading…
Cancel
Save